--- /dev/null
+@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}
+}
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.
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
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
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
-# <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>
+
+<!--[](-->
+<!--https://dev.azure.com/numpy/numpy/_build/latest?definitionId=1?branchName=main)-->
+<!--[](-->
+<!--https://github.com/numpy/numpy/actions/workflows/build_test.yml)-->
+<!--[](-->
+<!--https://app.travis-ci.com/numpy/numpy)-->
+<!--[](-->
+<!--https://circleci.com/gh/numpy/numpy)-->
+<!--[](-->
+<!--https://codecov.io/gh/numpy/numpy)-->
+
+[](
+https://numfocus.org)
+[](
+https://pypi.org/project/numpy/)
+[](
+https://anaconda.org/conda-forge/numpy)
+[](
+https://stackoverflow.com/questions/tagged/numpy)
+[](
+https://doi.org/10.1038/s41586-020-2649-2)
NumPy is the fundamental package needed for scientific computing with Python.
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
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.
-
-
-
-[](https://numfocus.org)
--- /dev/null
+
+/* This file is generated from numpy/distutils/system_info.py */
+void ATL_buildinfo(void);
+int main(void) {
+ ATL_buildinfo();
+ return 0;
+}
// 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
// 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
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])
--- /dev/null
+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.
+
Source tree
-----------
- INSTALL.rst.txt
-- release.sh
- pavement.py
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.
::
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
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
Trigger the wheel builds
------------------------
-See the `MacPython/numpy wheels` repository.
+See the `numpy wheels`_ repository.
In that repository edit the files:
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
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])")
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
-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`.
----------------------
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
--------------------------
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
``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
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
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
$ 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
--------------
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.
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
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::
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
$ 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
-------------------------
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.
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
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
--------------
+++ /dev/null
-# 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
+++ /dev/null
-all: build
-
-build:
- doxygen
-
-clean:
- rm -rf build
-
-.PHONY: all build clean
-
+++ /dev/null
-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.
-
+++ /dev/null
-#!/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()
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
* `#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
+++ /dev/null
-
-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
+++ /dev/null
-
-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
--- /dev/null
+
+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
-# -*- coding: utf-8 -*-
#
# NumPy Enhancement Proposals documentation build configuration file, created by
# sphinx-quickstart on Mon Dec 11 12:45:09 2017.
.. _NEP00:
===========================
-NEP 0 — Purpose and Process
+NEP 0 — Purpose and process
===========================
:Author: Jarrod Millman <millman@berkeley.edu>
.. _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>
.. _NEP10:
==============================================
-NEP 10 — Optimizing Iterator/UFunc Performance
+NEP 10 — Optimizing Iterator/UFunc performance
==============================================
:Author: Mark Wiebe <mwwiebe@gmail.com>
:Status: Final
*****************
-Table of Contents
+Table of contents
*****************
.. contents::
``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.
.. _NEP11:
==================================
-NEP 11 — Deferred UFunc Evaluation
+NEP 11 — Deferred UFunc evaluation
==================================
:Author: Mark Wiebe <mwwiebe@gmail.com>
.. _NEP12:
============================================
-NEP 12 — Missing Data Functionality in NumPy
+NEP 12 — Missing data functionality in NumPy
============================================
:Author: Mark Wiebe <mwwiebe@gmail.com>
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.
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::
.. _NEP13:
==========================================
-NEP 13 — A Mechanism for Overriding Ufuncs
+NEP 13 — A mechanism for overriding Ufuncs
==========================================
.. currentmodule:: numpy
``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
.. _NEP17:
================================
-NEP 17 — Split Out Masked Arrays
+NEP 17 — Split out masked arrays
================================
:Author: Stéfan van der Walt <stefanv@berkeley.edu>
: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
.. _NEP19:
=======================================
-NEP 19 — Random Number Generator Policy
+NEP 19 — Random number generator policy
=======================================
:Author: Robert Kern <robert.kern@gmail.com>
.. _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>
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>
.. _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>
.. _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>
.. _NEP27:
=========================
-NEP 27 — Zero Rank Arrays
+NEP 27 — Zero rank arrays
=========================
:Author: Alexander Belopolsky (sasha), transcribed Matt Picus <matti.picus@gmail.com>
: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
.. _NEP30:
======================================================
-NEP 30 — Duck Typing for NumPy Arrays - Implementation
+NEP 30 — Duck typing for NumPy arrays - Implementation
======================================================
:Author: Peter Andreas Entschev <pentschev@nvidia.com>
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
.. _NEP35:
===========================================================
-NEP 35 — Array Creation Dispatching With __array_function__
+NEP 35 — Array creation dispatching with __array_function__
===========================================================
:Author: Peter Andreas Entschev <pentschev@nvidia.com>
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.
==================
: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
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
-----
'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.
<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
- 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
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.
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:
.. _NEP40:
================================================
-NEP 40 — Legacy Datatype Implementation in NumPy
+NEP 40 — Legacy datatype implementation in NumPy
================================================
:title: Legacy Datatype Implementation in NumPy
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")``.
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 --
.. _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
>>> 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::
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>`_
: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.
******************************************************************************
.. _NEP43:
==============================================================================
-NEP 43 — Enhancing the Extensibility of UFuncs
+NEP 43 — Enhancing the extensibility of UFuncs
==============================================================================
:title: Enhancing the Extensibility of UFuncs
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
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.
.. _NEP44:
===================================================
-NEP 44 — Restructuring the NumPy Documentation
+NEP 44 — Restructuring the NumPy documentation
===================================================
:Author: Ralf Gommers
.. _NEP45:
=================================
-NEP 45 — C Style Guide
+NEP 45 — C style guide
=================================
:Author: Charles Harris <charlesr.harris@gmail.com>
.. _NEP46:
=====================================
-NEP 46 — NumPy Sponsorship Guidelines
+NEP 46 — NumPy sponsorship guidelines
=====================================
:Author: Ralf Gommers <ralf.gommers@gmail.com>
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
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.
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
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
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
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
~~~~~~~~~~~~~~~~~~~~~~~~
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
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
~~~~~~~~~~~~~~~~~
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
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
------------------------------------------------------
- `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
------------------------
.. [2] https://data-apis.org/blog/array_api_standard_release/
+.. [3] https://github.com/numpy/numpy/pull/18585#discussion_r641370294
Copyright
---------
.. _NEP48:
=====================================
-NEP 48 — Spending NumPy Project Funds
+NEP 48 — Spending NumPy project funds
=====================================
:Author: Ralf Gommers <ralf.gommers@gmail.com>
===================================
: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
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
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
=====================
.. 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
===========
#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;
}
}
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;
}
}
NPY_NO_EXPORT void
- shift_free(void * p, npy_uintp sz) {
+ shift_free(Allocator *ctx, void * p, npy_uintp sz) {
if (p == NULL) {
return ;
}
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;
}
}
}
- 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
------------
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
.. _`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
=================================
-NEP X — Template and Instructions
+NEP X — Template and instructions
=================================
:Author: <list of authors' real names and optionally, email addresses>
--- /dev/null
+#!/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()
+
--- /dev/null
+<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>
--- /dev/null
+<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
--- /dev/null
+<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>
--- /dev/null
+<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
+++ /dev/null
-{#
- 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 %}
+++ /dev/null
- <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>
-# -*- coding: utf-8 -*-
import os
import re
import sys
+import importlib
# Minimum version, enforced by sphinx
needs_sphinx = '3.2.0'
'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']
"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)
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),
}
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:
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")
--- /dev/null
+.. 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.
+
+
========================
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.
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
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:
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
--- /dev/null
+INPUT += @CUR_DIR
+INCLUDE_PATH += @CUR_DIR
--- /dev/null
+/**
+ * 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.
+};
--- /dev/null
+/**
+ * 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);
--- /dev/null
+/**
+ * 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);
~~~~~~~~~~~~~~~~~~
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
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
- 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
:maxdepth: 3
governance
- people
+++ /dev/null
-.. _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)
-
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
**********************
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.
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
*********************
--- /dev/null
+.. _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
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::
-------------
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
~~~~~~~~~~~~~~~
Git Basics <gitwash/index>
development_environment
development_gitpod
+ howto_build_docs
development_workflow
development_advanced_debugging
reviewer_guidelines
--- /dev/null
+.. 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.
--- /dev/null
+.. 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.
+
+
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
+++ /dev/null
-.. _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`.
+++ /dev/null
-.. _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
+++ /dev/null
-.. _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
+++ /dev/null
-.. _documentation:
-
-NumPy's Documentation
-=====================
-
-.. toctree::
- :maxdepth: 2
-
- howto_document
- howto_build_docs
-
--- /dev/null
+# 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
-======================
-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
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>}
<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
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``.
+++ /dev/null
-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
+++ /dev/null
->>> 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
+++ /dev/null
-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
+++ /dev/null
->>> 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
--- /dev/null
+.. _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/
--- /dev/null
+.. _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
--- /dev/null
+.. _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
--- /dev/null
+.. _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``
--- /dev/null
+.. _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
+++ /dev/null
- 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
+++ /dev/null
->>> 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])
+++ /dev/null
-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
+++ /dev/null
-! -*- 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
+++ /dev/null
->>> 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
--- /dev/null
+### 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
+ )
--- /dev/null
+### 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()
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+ 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
--- /dev/null
+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
--- /dev/null
+! -*- 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
--- /dev/null
+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
--- /dev/null
+ 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
--- /dev/null
+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
--- /dev/null
+! -*- 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/
--- /dev/null
+! -*- 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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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)
--- /dev/null
+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)
--- /dev/null
+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
--- /dev/null
+[project]
+requires-python = ">=3.7"
+
+[build-system]
+requires = ["setuptools>=42", "wheel", "scikit-build", "cmake>=3.18", "numpy>=1.21"]
--- /dev/null
+>>> 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
--- /dev/null
+>>> 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
--- /dev/null
+>>> 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])
--- /dev/null
+>>> 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
--- /dev/null
+>>> 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
--- /dev/null
+>>> 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!
--- /dev/null
+>>> 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
--- /dev/null
+>>> 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)
--- /dev/null
+>>> 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
--- /dev/null
+>>> 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']}}
--- /dev/null
+>>> 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
--- /dev/null
+>>> import spam
+>>> status = spam.system('whoami')
+pearu
+>>> status = spam.system('blah')
+sh: line 1: blah: command not found
\ No newline at end of file
--- /dev/null
+>>> 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')
--- /dev/null
+>>> import var
+>>> var.BAR
+5
\ No newline at end of file
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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']
+)
--- /dev/null
+! -*- 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
--- /dev/null
+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
--- /dev/null
+! -*- f90 -*-
+python module var
+ usercode '''
+ int BAR = 5;
+ '''
+ interface
+ usercode '''
+ PyDict_SetItemString(d,"BAR",PyInt_FromLong(BAR));
+ '''
+ end interface
+end python module
+++ /dev/null
-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
+++ /dev/null
->>> 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
+++ /dev/null
->>> 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!
+++ /dev/null
-=============================
-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
+++ /dev/null
- 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
+++ /dev/null
->>> 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
+.. _f2py-getting-started:
+
======================================
Three ways to wrap - getting started
======================================
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])
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.]
>>>
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 a 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:
::
.. 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
========================
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__)
+++ /dev/null
-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
+++ /dev/null
-! -*- 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/
+++ /dev/null
-! -*- 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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
->>> 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)
-#####################################
-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
.. toctree::
:maxdepth: 2
+ usage
f2py.getting-started
- signature-file
python-usage
- usage
- distutils
+ signature-file
+ buildtools/index
advanced
.. _Python: https://www.python.org/
+++ /dev/null
-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
+++ /dev/null
->>> 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
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
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.
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:
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::
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
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::
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)``.
* 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.
==============
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
+++ /dev/null
->>> 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']}}
+++ /dev/null
-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
+++ /dev/null
->>> 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
+++ /dev/null
-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
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.
=====================
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::
]...
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
end [ block data [<block data name>] ]
Type declarations
------------------
+=================
The definition of the ``<argument/variable type declaration>`` part
is
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
::
<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
::
<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`__?);
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:
::
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 a 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::
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
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
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
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]):
...
...
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:
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
For example, a function ``myrange(n)`` generated from the following
signature
-::
+.. code-block::
subroutine myrange(a,n)
fortranname ! myrange is a dummy wrapper
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.
+++ /dev/null
-! -*- 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
+++ /dev/null
->>> import spam
->>> status = spam.system('whoami')
-pearu
->>> status = spam.system('blah')
-sh: line 1: blah: command not found
\ No newline at end of file
+++ /dev/null
-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
+++ /dev/null
->>> 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')
===========
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
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> : ] \
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
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
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 a 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 a F77 compiler
+ ``--fcompiler-exec=<path>`` **[depreciated]**
+ Specify the path to a 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>``
``--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>]``
``-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
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``
``--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.
+++ /dev/null
-! -*- f90 -*-
-python module var
- usercode '''
- int BAR = 5;
- '''
- interface
- usercode '''
- PyDict_SetItemString(d,"BAR",PyInt_FromLong(BAR));
- '''
- end interface
-end python module
+++ /dev/null
->>> import var
->>> var.BAR
-5
\ No newline at end of file
--- /dev/null
+:orphan:
+
+Getting started
+===============
\ No newline at end of file
.. _numpy_docs_mainpage:
###################
-NumPy Documentation
+NumPy documentation
###################
.. toctree::
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
-.. _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.
: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.
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.
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
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__
-.. 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
ndarray.real
ndarray.imag
ndarray.flat
- ndarray.ctypes
.. _arrays.ndarray.array-interface:
ndarray.__str__
ndarray.__repr__
+
+Utility method for typing:
+
+.. autosummary::
+ :toctree: generated/
+
+ ndarray.__class_getitem__
``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")
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
.. 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``.
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
~~~~~~~~~~~~~
generic.__setstate__
generic.setflags
+Utility method for typing:
+
+.. autosummary::
+ :toctree: generated/
+
+ number.__class_getitem__
+
Defining new 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
^^^^^^^^^^^
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)
: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
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
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
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
function returns :c:data:`NPY_FALSE`.
-New data types
-^^^^^^^^^^^^^^
+User-defined data types
+^^^^^^^^^^^^^^^^^^^^^^^
.. c:function:: void PyArray_InitArrFuncs(PyArray_ArrFuncs* f)
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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. 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
- 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
/*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) {
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
-------------
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)
(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
.. 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)
--- /dev/null
+.. _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;
+ }
+ ...
generalized-ufuncs
coremath
deprecations
+ data_memory
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, \
.. 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.
PyArray_Descr *descr;
int flags;
PyObject *weakreflist;
- /* version dependend private members */
+ /* version dependent private members */
} PyArrayObject;
.. c:macro:: PyObject_HEAD
.. 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,
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:
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
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
.. 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.
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
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``.
distutils
distutils_guide
c-api/index
- internals
simd/simd-optimizations
swig
-.. 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
-.. _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`.
--------------
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
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`
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.
.. 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`.
+++ /dev/null
-.. _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
ma.masked_all
ma.masked_all_like
ma.ones
+ ma.ones_like
ma.zeros
+ ma.zeros_like
_____
_____
-Masked arrays arithmetics
-=========================
+Masked arrays arithmetic
+========================
-Arithmetics
-~~~~~~~~~~~
+Arithmetic
+~~~~~~~~~~
.. autosummary::
:toctree: generated/
ma.max
ma.min
ma.ptp
+ ma.diff
ma.MaskedArray.argmax
ma.MaskedArray.argmin
conj
conjugate
+Extrema Finding
+---------------
+.. autosummary::
+ :toctree: generated/
+
+ maximum
+ fmax
+ amax
+ nanmax
+
+ minimum
+ fmin
+ amin
+ nanmin
+
Miscellaneous
-------------
fabs
sign
heaviside
- maximum
- minimum
- fmax
- fmin
-
+
nan_to_num
real_if_close
:toctree: generated/
who
- disp
\ No newline at end of file
+ disp
+
+Exceptions
+----------
+.. autosummary::
+ :toctree: generated/
+
+ AxisError
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.).
`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
routines.fft
routines.functional
routines.help
- routines.indexing
routines.io
routines.linalg
routines.logic
.. autosummary::
:toctree: generated/
-
- amin
- amax
- nanmin
- nanmax
+
ptp
percentile
nanpercentile
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
~~~~~~~~~~~~~
- 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
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
#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,
#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
// @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:
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`
==============
.. 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.
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
*************
-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>
* ``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
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
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.
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
-------------------------------------
------------------------------------
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::
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>`__)
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>`__)
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 a 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
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:
* 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
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
* `#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
+++ /dev/null
-.. 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
+++ /dev/null
-.. 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.
--- /dev/null
+.. 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>`__)
+
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.
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:
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
.. 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!
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/>`_.
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
-------------------
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?
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.
-----
-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:
.. 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
.. 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 ::
.. _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
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.
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
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
[ 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.
--- /dev/null
+.. _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
>>> 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,
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
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
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],
array([[[0., 0.],
[0., 0.],
[0., 0.]],
-
+ <BLANKLINE>
[[0., 0.],
[0., 0.],
[0., 0.]]])
array([[[1., 1.],
[1., 1.],
[1., 1.]],
-
+ <BLANKLINE>
[[1., 1.],
[1., 1.],
[1., 1.]]])
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]])
>>> 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
>>> 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>`.
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. ],
.. _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. ::
>>> 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
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: ::
>>> 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
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
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.
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
... '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
basics.rec
basics.dispatch
basics.subclassing
+ basics.ufuncs
+ basics.copies
--- /dev/null
+.. 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`.
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
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
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
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
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:
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
~~~~~~
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
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.
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);
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
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
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:
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
-********************
+====================
Using Python as glue
-********************
+====================
| There is no conversation more boring than the one where everybody
| agrees.
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)
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::
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
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
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)
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``.
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
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
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
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
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
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
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``,
- 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).
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
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
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.
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
.. code-block:: c
+ #define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <math.h>
.. 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
.. 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
.. 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
.. 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>
/*
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?
numpy-for-matlab-users
building
c-info
- tutorials_index
+ NumPy Tutorials <https://numpy.org/numpy-tutorials/features.html>
howtos_index
depending_on_numpy
../f2py/index
../glossary
../dev/underthehood
- ../docs/index
../bugs
../release
- ../doc_conventions
../license
- 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
* - ``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``
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.
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.
::
- `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>`
:orphan:
-.. _array-broadcasting-in-numpy:
-
===========================
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.
+++ /dev/null
-=======================
-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>`
+++ /dev/null
-================================================
-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/>`__
+++ /dev/null
-.. _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
-
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?
--------------------
+++ /dev/null
-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
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
-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
- 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
-pycodestyle==2.7.0
+pycodestyle==2.8.0
GitPython==3.1.13
\ No newline at end of file
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
__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__ = {}
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. "
__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.
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.
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
# 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__
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,
_ArrayLikeTD64_co,
_ArrayLikeDT64_co,
_ArrayLikeObject_co,
+ _ArrayLikeStr_co,
+ _ArrayLikeBytes_co,
# DTypes
DTypeLike,
)
from typing import (
+ Literal as L,
Any,
ByteString,
Callable,
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,
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,
)
from numpy.core._asarray import (
- asarray as asarray,
- asanyarray as asanyarray,
- ascontiguousarray as ascontiguousarray,
- asfortranarray as asfortranarray,
require as require,
)
getbufsize as getbufsize,
seterrcall as seterrcall,
geterrcall as geterrcall,
- _SupportsWrite,
_ErrKind,
_ErrFunc,
_ErrDictOptional,
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,
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,
recfromtxt as recfromtxt,
recfromcsv as recfromcsv,
load as load,
- loads as loads,
save as save,
savez as savez,
savez_compressed as savez_compressed,
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__(
@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
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
@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,
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"]]
@property
def data(self) -> memoryview: ...
@property
- def flags(self) -> _flagsobj: ...
+ def flags(self) -> flagsobj: ...
@property
def itemsize(self) -> int: ...
@property
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
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
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(
_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],
# 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
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
@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: ...
) -> 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: ...
@overload
def reshape(
- self, __shape: _ShapeLike, *, order: _OrderACF = ...
+ self, shape: _ShapeLike, /, *, order: _OrderACF = ...
) -> ndarray[Any, _DType_co]: ...
@overload
def reshape(
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
# 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
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
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
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
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
# 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]
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
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
@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
@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
@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
@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
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
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
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
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
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
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
@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
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
@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
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
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
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
@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
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
@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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
@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
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
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
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
@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
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,
) -> Any: ...
def item(
- self,
- __args: Union[L[0], Tuple[()], Tuple[L[0]]] = ...,
+ self, args: L[0] | Tuple[()] | Tuple[L[0]] = ..., /,
) -> Any: ...
@overload
@overload
def reshape(
- self: _ScalarType, __shape: _ShapeLike, *, order: _OrderACF = ...
+ self: _ScalarType, shape: _ShapeLike, /, *, order: _OrderACF = ...
) -> ndarray[Any, _dtype[_ScalarType]]: ...
@overload
def reshape(
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]: ...
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: ...
__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
bool8 = bool_
class object_(generic):
- def __init__(self, __value: object = ...) -> None: ...
+ def __init__(self, value: object = ..., /) -> None: ...
@property
def real(self: _ArraySelf) -> _ArraySelf: ...
@property
@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: ...
__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
# 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]
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]
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: ...
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]
_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
# 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
__rmul__: _ComplexOp[_NBit1]
__truediv__: _ComplexOp[_NBit1]
__rtruediv__: _ComplexOp[_NBit1]
- __floordiv__: _ComplexOp[_NBit1]
- __rfloordiv__: _ComplexOp[_NBit1]
__pow__: _ComplexOp[_NBit1]
__rpow__: _ComplexOp[_NBit1]
# 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
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
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: ...
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
#
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
abs = absolute
+class _CopyMode(enum.Enum):
+ ALWAYS: L[True]
+ IF_NEEDED: L[False]
+ NEVER: L[2]
+
# Warnings
class ModuleDeprecationWarning(DeprecationWarning): ...
class VisibleDeprecationWarning(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
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: ...
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]: ...
motivated this module.
"""
+import enum
+
__ALL__ = [
- 'ModuleDeprecationWarning', 'VisibleDeprecationWarning', '_NoValue'
+ 'ModuleDeprecationWarning', 'VisibleDeprecationWarning',
+ '_NoValue', '_CopyMode'
]
_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'
# 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 += [
--- /dev/null
+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: ...
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
--- /dev/null
+"""
+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"]
--- /dev/null
+"""
+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)
--- /dev/null
+import numpy as np
+
+e = np.e
+inf = np.inf
+nan = np.nan
+pi = np.pi
--- /dev/null
+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))
--- /dev/null
+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
--- /dev/null
+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")
--- /dev/null
+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))
--- /dev/null
+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))
--- /dev/null
+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))
--- /dev/null
+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)
--- /dev/null
+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)
--- /dev/null
+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))
--- /dev/null
+"""
+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: ...
--- /dev/null
+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)))
--- /dev/null
+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']
--- /dev/null
+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)
--- /dev/null
+"""
+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.
+"""
--- /dev/null
+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
--- /dev/null
+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)))
--- /dev/null
+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]))
+ )
+++ /dev/null
-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=...): ...
import os
from pathlib import Path
import io
-
-import abc
-from abc import ABC as abc_ABC
-
try:
import pickle5 as pickle
except ImportError:
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(
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
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
__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__
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)
... 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:
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.
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
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
'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
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.
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.
.. versionadded:: 1.20.0
+ Returns
+ -------
+ out : ndarray
+
Notes
-----
If the buffer has data that is not in machine byte-order, this should
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)""")
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
----------
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.
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
-----
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',
"""
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.
"""))
"""))
+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.
"""))
-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',
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
----------
* '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
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.
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.
add_newdoc('numpy.core.umath', 'seterrobj',
"""
- seterrobj(errobj)
+ seterrobj(errobj, /)
Set the object that defines floating-point error handling.
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
* '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
"""))
+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.
+
+ """))
##############################################################################
#
* '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
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.
+
+ """))
##############################################################################
#
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`
>>> 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',
>>> 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 "")))
-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",
# 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 += "}"
@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
"""
(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())
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)
-
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)
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: ...
--- /dev/null
+"""
+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())
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,
# 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()
-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]]
-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
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
import functools
import numbers
+import sys
try:
from _thread import get_ident
except ImportError:
'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}
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
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
--------
_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)
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')
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):
options = _format_options.copy()
options.update(overrides)
- if options['legacy'] == '1.13':
+ if options['legacy'] <= 113:
if style is np._NoValue:
style = repr
" 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
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
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)
# 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(']')
# 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(']'))
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
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)
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:
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 = ' '
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 == '+')
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.
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)
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
sign = '+' if sign else '-'
floatmode_real = floatmode_imag = floatmode
- if legacy == '1.13':
+ if legacy <= 113:
floatmode_real = 'maxprec_equal'
floatmode_imag = 'maxprec'
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)
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
>>> 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)
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,):
# 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:
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())
-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 (
)
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):
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] = ...,
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(
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,
sign: Optional[Literal["-", "+", " "]] = ...,
floatmode: Optional[_FloatMode] = ...,
*,
- legacy: Optional[Literal[False, "1.13"]] = ...
+ legacy: Optional[Literal[False, "1.13", "1.21"]] = ...
) -> _GeneratorContextManager[_FormatOptions]: ...
# 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
# 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
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'),
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 = {}
'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'),
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':
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':
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,
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'),
),
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'),
),
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'),
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'),
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'),
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'),
),
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'),
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'),
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'),
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':
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':
multiarray_global_vars = {
'NPY_NUMUSERTYPES': (7, 'int'),
'NPY_DEFAULT_ASSIGN_CASTING': (292, 'NPY_CASTING'),
+ 'PyDataMem_DefaultHandler': (306, 'PyObject*'),
}
multiarray_scalar_bool_values = {
# 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,),
'PyArray_ResolveWritebackIfCopy': (302,),
'PyArray_SetWritebackIfCopyBase': (303,),
# End 1.14 API
+ 'PyDataMem_SetHandler': (304,),
+ 'PyDataMem_GetHandler': (305,),
+ # End 1.21 API
}
ufunc_types_api = {
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
--------
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
----------
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
--------
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
----------
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
--------
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
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:
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
--------
[ 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
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
--------
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
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.
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
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
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
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
----------
>>> 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',
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
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',
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
----------
.. [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
"""
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
----------
"""
import functools
-import sys
from .numerictypes import (
string_, unicode_, integer, int_, object_, bool_, character)
from .numeric import ndarray, compare_chararrays
return isdecimal(self)
+@set_module("numpy.char")
def array(obj, itemsize=None, copy=True, unicode=None, order=None):
"""
Create a `chararray`.
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
--- /dev/null
+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_]: ...
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
-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,
_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]]]],
# 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] = ...,
) -> Any: ...
@overload
def einsum(
- __subscripts: str,
+ subscripts: str,
+ /,
*operands: _ArrayLikeUInt_co,
out: None = ...,
dtype: Optional[_DTypeLikeUInt] = ...,
) -> Any: ...
@overload
def einsum(
- __subscripts: str,
+ subscripts: str,
+ /,
*operands: _ArrayLikeInt_co,
out: None = ...,
dtype: Optional[_DTypeLikeInt] = ...,
) -> Any: ...
@overload
def einsum(
- __subscripts: str,
+ subscripts: str,
+ /,
*operands: _ArrayLikeFloat_co,
out: None = ...,
dtype: Optional[_DTypeLikeFloat] = ...,
) -> Any: ...
@overload
def einsum(
- __subscripts: str,
+ subscripts: str,
+ /,
*operands: _ArrayLikeComplex_co,
out: None = ...,
dtype: Optional[_DTypeLikeComplex] = ...,
) -> Any: ...
@overload
def einsum(
- __subscripts: str,
+ subscripts: str,
+ /,
*operands: Any,
casting: _CastingUnsafe,
dtype: Optional[_DTypeLikeComplex_co] = ...,
) -> Any: ...
@overload
def einsum(
- __subscripts: str,
+ subscripts: str,
+ /,
*operands: _ArrayLikeComplex_co,
out: _ArrayType,
dtype: Optional[_DTypeLikeComplex_co] = ...,
) -> _ArrayType: ...
@overload
def einsum(
- __subscripts: str,
+ subscripts: str,
+ /,
*operands: Any,
out: _ArrayType,
casting: _CastingUnsafe,
# 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]: ...
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.
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.
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.
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
--------
>>> 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.
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
--------
>>> 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):
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
--------
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
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
--------
>>> b = np.array([1, 2e-9, 3e-9] * 1000000)
>>> b.cumsum()[-1]
1000000.0050045159
- >>> b.sum()
+ >>> b.sum()
1000000.0050000029
"""
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
>>> 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
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
----------
.. [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)
-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,
_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,
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
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
-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,
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: ...
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):
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,
_KNOWN_TYPES[bytepat] = machar
_float_ma = {}
+
def _register_known_types():
# Known parameters for float16
# See docstring of MachAr class for description of parameters.
# 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')
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
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
----------
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,
'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]
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):
'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__
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:
--- /dev/null
+from typing import List
+
+from numpy import (
+ finfo as finfo,
+ iinfo as iinfo,
+)
+
+__all__: List[str]
--- /dev/null
+INCLUDE_PATH += @CUR_DIR
+PREDEFINED += NPY_INTERNAL_BUILD
-#ifndef _NPY_INCLUDE_NEIGHBORHOOD_IMP
+#ifndef NUMPY_CORE_INCLUDE_NUMPY__NEIGHBORHOOD_IMP_H_
#error You should not include this header directly
#endif
/*
-#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"
#include "noprefix.h"
#endif
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_ARRAYOBJECT_H_ */
-#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 {
#define PyArrayScalar_ASSIGN(obj, cls, val) \
PyArrayScalar_VAL(obj, cls) = val
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_ARRAYSCALARS_H_ */
--- /dev/null
+/*
+ * 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_ */
-#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>
}
#endif
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_HALFFLOAT_H_ */
// 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
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_
/*
* 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
#endif
-#endif /* NPY_NDARRAYOBJECT_H */
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_NDARRAYOBJECT_H_ */
-#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"
#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
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.
*
/* 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;
/*
/*
* 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.
*/
#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.
_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]; \
#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
* 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
((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) || \
*/
#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.
* it is a fairly complex construct which may be better to allow
* refactoring of.
*/
- struct PyArray_DTypeMeta_tag {
+ typedef struct {
PyHeapTypeObject super;
/*
* 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 */
*/
#undef NPY_DEPRECATED_INCLUDES
-#endif /* NPY_ARRAYTYPES_H */
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_NDARRAYTYPES_H_ */
-#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_ */
-#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_ */
* 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>
#endif
-#endif /* _NPY_3KCOMPAT_H_ */
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_NPY_3KCOMPAT_H_ */
-#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>
/* End of typedefs for numarray style bit-width names */
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_NPY_COMMON_H_ */
* 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_ */
-#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_ */
* 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_ */
-#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" {
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
*/
union { \
ctype z; \
type a[2]; \
- } z1;; \
+ } z1; \
\
z1.a[0] = (x); \
z1.a[1] = (y); \
#include "npy_math_internal.h"
#endif
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_NPY_MATH_H_ */
#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 */
-#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
#define NPY_OS_UNKNOWN
#endif
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_NPY_OS_H_ */
-#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
#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_ */
/* 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_ */
+#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
#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_ */
-#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>
} bitgen_t;
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_RANDOM_BITGEN_H_ */
-#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>
#define RAND_INT_MAX INT64_MAX
#endif
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__CYGWIN__)
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR extern
}
#endif
-#endif
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_RANDOM_DISTRIBUTIONS_H_ */
-#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>
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
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
* 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.
/* 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"
#endif
#endif
-
#ifdef __cplusplus
}
#endif
-#endif /* !Py_UFUNCOBJECT_H */
+
+#endif /* NUMPY_CORE_INCLUDE_NUMPY_UFUNCOBJECT_H_ */
-#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__)
#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_ */
+++ /dev/null
-"""
-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())
--- /dev/null
+from typing import List
+
+from numpy import memmap as memmap
+
+__all__: List[str]
"""
import functools
-import warnings
-
from . import overrides
from . import _multiarray_umath
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__ = [
'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'
@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.
@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`.
@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
@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.
@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.
@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.
@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.
@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.
@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
--- /dev/null
+# 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, ...]: ...
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)
'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',
>>> 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]])
>>> 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)
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)
`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
--------
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
--------
-import sys
from typing import (
Any,
- Optional,
Union,
Sequence,
Tuple,
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,
) -> _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(
) -> _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(
) -> _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(
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],
**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,
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: ...
"""
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
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 (
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__(
) -> 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]
import collections
import functools
import os
-import textwrap
from numpy.core._multiarray_umath import (
add_docstring, implement_array_function, _get_implementing_args)
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.
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
array([2., 2.])
"""
-import os
import warnings
from collections import Counter
from contextlib import nullcontext
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__ = [
'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
__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__()
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)
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
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.
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
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
_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):
"""
--- /dev/null
+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]: ...
import warnings
import platform
import textwrap
+import glob
from os.path import join
from numpy.distutils import log
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':
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):
# 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))
# 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
"""))
# 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])
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)
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'])
#######################################################################
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'),
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'),
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'),
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'),
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'),
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'),
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 = [
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,
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 #
# 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
-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]: ...
***************************/
#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**/
***************************/
#if @fp_only@
/**begin repeat1
- * #intrin = sqrt, recip, abs, square#
+ * #intrin = sqrt, recip, abs, square, ceil, trunc#
*/
SIMD_INTRIN_DEF(@intrin@_@sfx@)
/**end repeat1**/
"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);
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
};
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);
}
--- /dev/null
+INCLUDE_PATH += @CUR_DIR
*
* 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"
-#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
arrays_overlap(PyArrayObject *arr1, PyArrayObject *arr2);
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_ARRAY_ASSIGN_H_ */
-#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>
} \
} while (0)
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_BINOP_OVERRIDE_H_ */
* 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};
-#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_ */
--- /dev/null
+// 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_
-#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)
return maybe_get_attr(obj, name);
}
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_GET_ATTR_STRING_H_ */
-#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"
stride2 = PyArray_TRIVIAL_PAIR_ITERATION_STRIDE(size2, arr2); \
}
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_LOWLEVEL_STRIDED_LOOPS_H_ */
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"
-#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"
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_ */
-#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"
-#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"
/*
_npy_parse_arguments(funcname, &__argparse_cache, \
args, len_args, kwnames, __VA_ARGS__)
-#endif /* _NPY_ARGPARSE_H */
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_ARGPARSE_H */
* 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>
}
#endif
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_CBLAS_H_ */
* 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,
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_ */
-#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_ */
-#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.
* 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_
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);
-#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
}
#endif
-#endif // _NPY_CPU_FEATURES_H_
+#endif // NUMPY_CORE_SRC_COMMON_NPY_CPU_FEATURES_H_
* 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>
}
/*
- * 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.
*
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);
*hwcap2 |= has_list_item(cpuFeatures, "crc32") ? NPY__HWCAP2_CRC32 : 0;
return 1;
}
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_CPUINFO_PARSER_H_ */
-#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>
return 0;
}
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_CTYPES_H_ */
--- /dev/null
+#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
-#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 {
return result;
}
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_EXTINT128_H_ */
-#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"
#define HAVE_LDOUBLE_DOUBLE_DOUBLE_BE
#endif
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_NPY_FPMATH_H_ */
--- /dev/null
+/*
+ * 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];
+}
--- /dev/null
+#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_ */
-#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>
}
}
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_IMPORT_H_ */
-#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"
-#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"
NPY_VISIBILITY_HIDDEN npy_longdouble
npy_longdouble_from_PyLong(PyObject *long_obj);
-#endif
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_LONGDOUBLE_H_ */
-#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"
#endif
-#endif /* _NPY_COMPAT_H_ */
+#endif /* NUMPY_CORE_SRC_COMMON_NPY_PYCOMPAT_H_ */
* #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**/
--- /dev/null
+#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
--- /dev/null
+#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
+#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
-#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,
/* 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_ */
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
#include "numpy/npy_common.h"
#include "npy_cblas.h"
{
__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);
}
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
#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
#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) \
{ \
/**
- * 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
* 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:
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);
#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
#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
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
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
#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
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); } \
#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"
-#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_ */
-#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"
*/
NPY_NO_EXPORT int
PyUFuncOverride_GetOutObjects(PyObject *kwds, PyObject **out_kwd_obj, PyObject ***out_objs);
-#endif
+
+#endif /* NUMPY_CORE_SRC_COMMON_UFUNC_OVERRIDE_H_ */
+#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_ */
* 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}
-#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];
NPY_NO_EXPORT int
PyArray_InitializeDatetimeCasts(void);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY__DATETIME_H_ */
/* -*-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"
#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
* 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) {
* 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) {
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;
}
}
}
+ 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);
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.
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;
}
}
+/*
+ * 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.
*/
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,
{"npy_discard",
npy_discard,
METH_O, NULL},
+ {"npy_ensurenocopy",
+ npy_ensurenocopy,
+ METH_O, NULL},
{"get_buffer_info",
get_buffer_info,
METH_VARARGS, NULL},
"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},
+#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"
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);
}
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);
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);
}
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: */
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);
}
* `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 = {{{
.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 = {{{
.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,
};
-#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"
NPY_NO_EXPORT int
initialize_and_map_pytypes_to_dtypes(void);
-#endif /*_NPY_ABSTRACTDTYPES_H */
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_ABSTRACTDTYPES_H_ */
+#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
/* 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);
return p;
}
NPY_BEGIN_THREADS;
- p = PyDataMem_NEW_ZEROED(sz, 1);
+ p = PyDataMem_NEW_ZEROED(nmemb, size);
NPY_END_THREADS;
return p;
}
/* 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.
* 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;
}
}
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;
+}
-#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
_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);
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_ */
*
* 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"
*
* 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"
#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"
*
* 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
* 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.
* 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;
}
* 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;
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;
cache = PyMem_Malloc(sizeof(coercion_cache_obj));
}
if (cache == NULL) {
+ Py_DECREF(arr_or_sequence);
PyErr_NoMemory();
return -1;
}
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.
}
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);
* (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).
*/
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;
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;
}
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;
* 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.
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;
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;
}
* 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;
}
* 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
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) {
-#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_
/*
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,
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_ */
* 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"
/*
{
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:
}
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;
}
"(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;
}
}
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)",
}
+/*
+ * 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).
*
};
-
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;
}
*/
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;
}
"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;
}
+/*
+ * 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."},
-#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
* 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 = (
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.
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_ */
-#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(
array_function_method_impl(PyObject *func, PyObject *types, PyObject *args,
PyObject *kwargs);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_ARRAYFUNCTION_OVERRIDE_H_ */
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"
*/
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;
}
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 */
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); \
#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); \
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.
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;
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)
.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,
};
-#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);
*/
static const int NPY_ARRAY_WARN_ON_WRITE = (1 << 31);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_ARRAYOBJECT_H_ */
/* -*- c -*- */
#define PY_SSIZE_T_CLEAN
-#include "Python.h"
-#include "structmember.h"
+#include <Python.h>
+#include <structmember.h>
#include <limits.h>
#include <assert.h>
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;
}
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
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;
}
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;
}
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) {
}
finish:
+ Py_XDECREF(mem_handler);
return res;
}
-#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"
npy_intp nk, enum NPY_TYPES ktype,
char * out_, npy_intp ostride);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_ARRAYTYPES_H_ */
+#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"
+#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"
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) {
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");
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,
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
*/
-#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);
NPY_NO_EXPORT PyObject*
PyArray_Any(PyArrayObject* self, int axis, PyArrayObject* out);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_CALCULATION_H_ */
+#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"
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;
}
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;
}
-#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())
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"
/*
*/
#define NPY_ITER_REDUCTION_AXIS(axis) (axis + (1 << (NPY_BITSOF_INT - 2)))
-#endif
-
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_COMMON_H_ */
+#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"
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;
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.
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;
}
* 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);
-#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
PyArray_PromoteDTypeSequence(
npy_intp length, PyArray_DTypeMeta **dtypes_in);
-#endif /* _NPY_COMMON_DTYPE_H_ */
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_COMMON_DTYPE_H_ */
#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"
#include "common.h"
#include "simd/simd.h"
+#include <string.h>
+
typedef enum {
PACK_ORDER_LITTLE = 0,
PACK_ORDER_BIG
{
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;
-#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 *);
NPY_NO_EXPORT PyObject *
io_unpack(PyObject *, PyObject *, PyObject *);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_COMPILED_BASE_H_ */
+#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"
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
*
-#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);
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);
*/
extern NPY_NO_EXPORT int evil_global_disable_warn_O4O8_flag;
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_CONVERSION_UTILS_H_ */
+#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"
* 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;
}
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;
}
#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;
(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);
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);
/* 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);
-#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_ */
+#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"
{
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);
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) {
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;
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;
}
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;
}
/**
* 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.
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);
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;
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;
}
* 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);
/* 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) {
* 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);
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;
}
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;
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;
}
* 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(
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;
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++) {
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;
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.
* 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)
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;
}
* 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
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) {
}
}
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) {
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 */
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 {
* 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:
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:
/* 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
* 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. "
"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;
}
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;
}
-#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"
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(
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_ */
+#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"
fa->nd = nd;
fa->dimensions = NULL;
fa->data = NULL;
+ fa->mem_handler = NULL;
if (data == NULL) {
fa->flags = NPY_ARRAY_DEFAULT;
}
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;
}
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;
* 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;
}
return (PyObject *)fa;
fail:
+ Py_XDECREF(fa->mem_handler);
Py_DECREF(fa);
return NULL;
}
/* 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;
* 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
*/
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;
/*
* 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 {
* 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;
}
}
/* 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;
}
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);
((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);
/*
* NPY_ARRAY_WRITEBACKIFCOPY,
* NPY_ARRAY_FORCECAST,
* NPY_ARRAY_ENSUREARRAY,
- * NPY_ARRAY_ELEMENTSTRIDES
+ * NPY_ARRAY_ELEMENTSTRIDES,
+ * NPY_ARRAY_ENSURENOCOPY
*
* or'd (|) together
*
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;
!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;
if (flags & NPY_ARRAY_ENSUREARRAY) {
subtype = &PyArray_Type;
}
-
ret = (PyArrayObject *)PyArray_View(arr, NULL, subtype);
if (ret == NULL) {
return NULL;
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()) {
}
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.
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) {
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
*/
/* 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;
/* 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;
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;
}
fail = 1;
}
if (fail) {
- PyErr_SetString(PyExc_IOError,
+ PyErr_SetString(PyExc_OSError,
"could not seek in file");
return NULL;
}
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;
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;
}
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();
*/
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;
* (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");
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;
}
-#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(
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,
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);
PyArray_SubclassWrap(PyArrayObject *arr_of_subclass, PyArrayObject *towrap);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_CTORS_H_ */
*
* 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)`.
}
/*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.
*/
{
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 */
}
/* 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",
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;
}
{
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;
}
*
* 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"
-#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
array_is_busday(PyObject *NPY_UNUSED(self),
PyObject *args, PyObject *kwds);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAY_H_ */
*
* 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"
}
static PyObject *
-busdaycalendar_weekmask_get(NpyBusDayCalendar *self)
+busdaycalendar_weekmask_get(NpyBusDayCalendar *self, void *NPY_UNUSED(ignored))
{
PyArrayObject *ret;
npy_intp size = 7;
}
static PyObject *
-busdaycalendar_holidays_get(NpyBusDayCalendar *self)
+busdaycalendar_holidays_get(NpyBusDayCalendar *self, void *NPY_UNUSED(ignored))
{
PyArrayObject *ret;
PyArray_Descr *date_dtype;
-#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
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_DATETIME_BUSDAYCAL_H_ */
*
* 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"
#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
-#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:
array_datetime_as_string(PyObject *NPY_UNUSED(self), PyObject *args,
PyObject *kwds);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_DATETIME_STRINGS_H_ */
/* 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"
#include "alloc.h"
#include "assert.h"
#include "npy_buffer.h"
+#include "dtypemeta.h"
/*
* offset: A starting offset.
_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;
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;
}
}
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));
}
}
else {
- PyErr_SetString(PyExc_TypeError,
+ PyErr_SetString(PyExc_TypeError,
"First element of field tuple is "
"neither a tuple nor str");
goto fail;
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`.
};
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;
}
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;
}
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;
}
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);
}
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);
}
static PyObject *
-arraydescr_ndim_get(PyArray_Descr *self)
+arraydescr_ndim_get(PyArray_Descr *self, void *NPY_UNUSED(ignored))
{
Py_ssize_t ndim;
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;
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);
* 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;
* 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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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;
}
}
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);
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__",
{"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 */
};
.tp_new = arraydescr_new,
},},
.type_num = -1,
- .kind = '\0',
- .abstract = 1,
- .parametric = 0,
- .singleton = 0,
+ .flags = NPY_DT_ABSTRACT,
+ .singleton = NULL,
.scalar_type = NULL,
};
-#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);
extern NPY_NO_EXPORT char const *_datetime_strings[];
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_DESCRIPTOR_H_ */
--- /dev/null
+#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;
+}
+
+
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;
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);
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
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);
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
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;
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;
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);
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;
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);
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;
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;
* 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"
int min_digits, int sign, TrimMode trim, int pad_left,
int exp_digits);
-#endif
-
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_DRAGON4_H_ */
* 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"
-#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"
int *out_needs_api, int allow_wrapped);
-#endif /* _NPY_DTYPE_TRANSFER_H */
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_DTYPE_TRANSFER_H_ */
/* 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"
#include "convert_datatype.h"
#include "usertypes.h"
+#include <assert.h>
static void
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);
}
* 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);
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 "
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;
}
return descr1;
}
-static int
+NPY_NO_EXPORT int
python_builtins_are_known_scalar_types(
PyArray_DTypeMeta *NPY_UNUSED(cls), PyTypeObject *pytype)
{
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.)
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);
}
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;
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
.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;
}
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;
}
}
}
+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},
};
/* 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,
-#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.
}
+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_ */
*/
#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
*
* 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
#define NPY_EINSUM_DBG_PRINT3(s, p1, p2, p3)
#endif
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_EINSUM_DEBUG_H_ */
/* 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
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
/* 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#
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
-#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>
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_ */
--- /dev/null
+#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);
+}
--- /dev/null
+/*
+ * 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_ */
/* 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"
#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)); \
}
#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) {\
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 */
static PyObject *
-arrayflags_forc_get(PyArrayFlagsObject *self)
+arrayflags_forc_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
{
PyObject *item;
}
static PyObject *
-arrayflags_fnc_get(PyArrayFlagsObject *self)
+arrayflags_fnc_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
{
PyObject *item;
}
static PyObject *
-arrayflags_farray_get(PyArrayFlagsObject *self)
+arrayflags_farray_get(PyArrayFlagsObject *self, void *NPY_UNUSED(ignored))
{
PyObject *item;
}
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;
/* 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;
}
static int
-arrayflags_aligned_set(PyArrayFlagsObject *self, PyObject *obj)
+arrayflags_aligned_set(
+ PyArrayFlagsObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
{
PyObject *res;
}
static int
-arrayflags_writeable_set(PyArrayFlagsObject *self, PyObject *obj)
+arrayflags_writeable_set(
+ PyArrayFlagsObject *self, PyObject *obj, void *NPY_UNUSED(ignored))
{
PyObject *res;
}
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
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;
}
}
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:
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,
/* 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;
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;
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);
}
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);
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;
}
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)),
}
static PyObject *
-array_ctypes_get(PyArrayObject *self)
+array_ctypes_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
{
PyObject *_numpy_internal;
PyObject *ret;
}
static PyObject *
-array_interface_get(PyArrayObject *self)
+array_interface_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
{
PyObject *dict;
PyObject *obj;
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) {
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) {
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) {
}
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;
}
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) ||
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));
}
* 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;
}
static PyObject *
-array_struct_get(PyArrayObject *self)
+array_struct_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
{
PyArrayInterface *inter;
}
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();
}
}
static PyObject *
-array_base_get(PyArrayObject *self)
+array_base_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
{
if (PyArray_BASE(self) == NULL) {
Py_RETURN_NONE;
*/
static PyObject *
-array_real_get(PyArrayObject *self)
+array_real_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
{
PyArrayObject *ret;
static int
-array_real_set(PyArrayObject *self, PyObject *val)
+array_real_set(PyArrayObject *self, PyObject *val, void *NPY_UNUSED(ignored))
{
PyArrayObject *ret;
PyArrayObject *new;
*/
static PyObject *
-array_imag_get(PyArrayObject *self)
+array_imag_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
{
PyArrayObject *ret;
}
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,
}
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;
}
static PyObject *
-array_transpose_get(PyArrayObject *self)
+array_transpose_get(PyArrayObject *self, void *NPY_UNUSED(ignored))
{
return PyArray_Transpose(self, NULL);
}
--- 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;
}
-#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_ */
-#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"
-#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_ */
-#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"
return NULL;
}
+
/*NUMPY_API
*/
NPY_NO_EXPORT PyObject *
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);
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;
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;
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;
}
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);
/* 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;
}
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;
}
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;
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 */
}
Py_XDECREF(it);
Py_XDECREF(rit);
+ Py_DECREF(mem_handler);
return (PyObject *)rop;
}
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;
}
-#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
PyArray_MultiIndexSetItem(PyArrayObject *self, const npy_intp *multi_index,
PyObject *obj);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_ITEM_SELECTION_H_ */
+#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"
};
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);
/** 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
*/
PyArray_Broadcast(PyArrayMultiIterObject *mit)
{
int i, nd, k, j;
+ int src_iter = -1; /* Initializing avoids a compiler warning. */
npy_intp tmp;
PyArrayIterObject *it;
}
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;
}
}
}
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;
-#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 *);
NPY_NO_EXPORT void
PyArray_RawIterBaseInit(PyArrayIterObject *it, PyArrayObject *ao);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_ITERATORS_H_ */
* 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"
-#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_ */
*/
#define PY_SSIZE_T_CLEAN
-#include "Python.h"
+#include <Python.h>
#define NPY_NO_DEPRECATED_API NPY_API_VERSION
#define _MULTIARRAYMODULE
# 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
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,
+#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"
-#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;
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_ */
+#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
*
{
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) {
{
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) {
*/
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;
* 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(
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;
}
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;
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);
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)) {
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));
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();
}
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)) {
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 +
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 */
(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,
{"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 */
};
-#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"
return PyObject_CallFunctionObjArgs(os_fspath, file, NULL);
}
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_METHODS_H_ */
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"
#include "typeinfo.h"
#include "get_attr_string.h"
+#include "experimental_public_dtype_api.h" /* _get_experimental_dtype_api */
+
+#include "npy_dlpack.h"
/*
*****************************************************************************
/*
* 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)
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;
}
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;
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;
}
/* 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;
}
}
- 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;
}
{
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;
if (npy_parse_arguments("array", args, len_args, kwnames,
"object", NULL, &op,
"|dtype", &PyArray_DescrConverter2, &type,
- "$copy", &PyArray_BoolConverter, ©,
+ "$copy", &PyArray_CopyConverter, ©,
"$order", &PyArray_OrderConverter, &order,
"$subok", &PyArray_BoolConverter, &subok,
"$ndmin", &PyArray_PythonPyIntFromInt, &ndmin,
return NULL;
}
if (npy_fseek(fp, offset, SEEK_CUR) != 0) {
- PyErr_SetFromErrno(PyExc_IOError);
+ PyErr_SetFromErrno(PyExc_OSError);
goto cleanup;
}
if (type == NULL) {
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)
Py_RETURN_NONE;
}
-
static struct PyMethodDef array_module_methods[] = {
{"_get_implementing_args",
(PyCFunction)array__get_implementing_args,
{"_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,
{"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 */
};
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;
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 = {
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;
}
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;
initialize_casting_tables();
initialize_numeric_types();
+
if (initscalarmath(m) < 0) {
goto err;
}
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;
goto err;
}
- if (!intern_strings()) {
+ if (intern_strings() < 0) {
goto err;
}
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:
PyErr_SetString(PyExc_RuntimeError,
"cannot load multiarray module.");
}
+ Py_DECREF(m);
return NULL;
}
-#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_ */
*/
#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"
--p;
}
}
- else if (p <= 0) {
+ else {
if (p < -1-axis) {
++p;
}
/*
* 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));
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;
}
*/
#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"
/*
* 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) {
/*
* 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
* 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"
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.
NPY_NO_EXPORT void
npyiter_clear_buffers(NpyIter *iter);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_NDITER_IMPL_H_ */
*
* 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"
}
static PyObject *
-npyiter_reset(NewNpyArrayIterObject *self)
+npyiter_reset(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
{
if (self->iter == NULL) {
PyErr_SetString(PyExc_ValueError,
* copied.
*/
static PyObject *
-npyiter_copy(NewNpyArrayIterObject *self)
+npyiter_copy(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
{
NewNpyArrayIterObject *iter;
}
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)) {
}
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,
}
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,
}
static PyObject *
-npyiter_debug_print(NewNpyArrayIterObject *self)
+npyiter_debug_print(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
{
if (self->iter != NULL) {
NpyIter_DebugPrint(self->iter);
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;
return ret;
}
-static PyObject *npyiter_operands_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_operands_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
{
PyObject *ret;
return ret;
}
-static PyObject *npyiter_itviews_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_itviews_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
{
PyObject *ret;
}
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];
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];
}
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];
}
}
-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,
}
}
-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,
}
}
-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,
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;
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;
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;
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,
}
}
-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,
}
}
-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,
}
}
-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,
}
}
-static PyObject *npyiter_dtypes_get(NewNpyArrayIterObject *self)
+static PyObject *
+npyiter_dtypes_get(NewNpyArrayIterObject *self, void *NPY_UNUSED(ignored))
{
PyObject *ret;
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,
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,
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,
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;
}
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");
}
static PyObject *
-npyiter_close(NewNpyArrayIterObject *self)
+npyiter_close(NewNpyArrayIterObject *self, PyObject *NPY_UNUSED(args))
{
NpyIter *iter = self->iter;
int ret;
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[] = {
-#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_ */
/* 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];
-#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;
NPY_NO_EXPORT int
void_getbuffer(PyObject *obj, Py_buffer *view, int flags);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_NPY_BUFFER_H_ */
+#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"
return NPY_NOSCALAR;
}
val = PyLong_AsSsize_t(value);
+ Py_DECREF(value);
if (error_converting(val)) {
PyErr_Clear();
return NPY_NOSCALAR;
-#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;
PyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,
int rtype, PyArrayObject *out);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_NUMBER_H_ */
* 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"
-#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);
NPY_NO_EXPORT void
PyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_REFCOUNT_H_ */
+#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"
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) ||
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);
/* -*- 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},
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#
{
npy_@name@ absval;
- if (npy_legacy_print_mode == 113) {
+ if (npy_legacy_print_mode <= 113) {
return legacy_@name@_format@kind@(val);
}
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);
}
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);
}
}
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);
}
static PyObject *
-voidtype_dtypedescr_get(PyVoidScalarObject *self)
+voidtype_dtypedescr_get(PyVoidScalarObject *self, void *NPY_UNUSED(ignored))
{
Py_INCREF(self->descr);
return (PyObject *)self->descr;
static PyObject *
-inttype_numerator_get(PyObject *self)
+inttype_numerator_get(PyObject *self, void *NPY_UNUSED(ignored))
{
Py_INCREF(self);
return 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;
}
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;
}
}
static PyObject *
-gentype_struct_get(PyObject *self)
+gentype_struct_get(PyObject *self, void *NPY_UNUSED(ignored))
{
PyArrayObject *arr;
PyArrayInterface *inter;
}
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;
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;
}
static PyObject *
-gentype_real_get(PyObject *self)
+gentype_real_get(PyObject *self, void *NPY_UNUSED(ignored))
{
PyArray_Descr *typecode;
PyObject *ret;
}
static PyObject *
-gentype_imag_get(PyObject *self)
+gentype_imag_get(PyObject *self, void *NPY_UNUSED(ignored))
{
PyArray_Descr *typecode=NULL;
PyObject *ret;
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);
}
}
static PyObject *
-gentype_flat_get(PyObject *self)
+gentype_flat_get(PyObject *self, void *NPY_UNUSED(ignored))
{
PyObject *ret, *arr;
static PyObject *
-gentype_transpose_get(PyObject *self)
+gentype_transpose_get(PyObject *self, void *NPY_UNUSED(ignored))
{
Py_INCREF(self);
return self;
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
*/
/* 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@));
}
/**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
{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#
*/
{"__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 */
};
/**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#
*/
{"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
"user-defined scalar %R registered for built-in dtype %S? "
"This should be impossible.",
self, descr);
+ Py_DECREF(descr);
return -1;
}
view->ndim = 0;
(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();
}
PyIntegerArrType_Type.tp_getset = inttype_getsets;
+ PyNumberArrType_Type.tp_methods = numbertype_methods;
+
/**begin repeat
* #NAME= Number, Integer, SignedInteger, UnsignedInteger, Inexact,
* Floating, ComplexFloating, Flexible, Character#
/**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#
/**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;
-#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
NPY_NO_EXPORT void *
scalar_value(PyObject *scalar, PyArray_Descr *descr);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_SCALARTYPES_H_ */
+#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"
-#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_ */
+#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"
}
/* 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");
-#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
NPY_NO_EXPORT PyObject *
PyArray_SqueezeSelected(PyArrayObject *self, npy_bool *axis_flags);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_SHAPE_H_ */
#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"
-#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);
NPY_NO_EXPORT PyObject *
array_format(PyArrayObject *self, PyObject *args);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_STRFUNCS_H_ */
+#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"
-#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>
PyObject * (inplace_op)(PyArrayObject * m1, PyObject * m2),
PyObject ** res, int commutative);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_TEMP_ELIDE_H_ */
* 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))
#include <structseq.h>
#endif
-#define NPY_NO_DEPRECATED_API NPY_API_VERSION
-#define _MULTIARRAYMODULE
-#include "npy_pycompat.h"
static PyTypeObject PyArray_typeinfoType;
-#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>
char typechar, int typenum, int nbits, int align,
PyObject *max, PyObject *min, PyTypeObject *type_obj);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_TYPEINFO_H_ */
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"
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.
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) {
"RegisterCanCast must be user-defined.");
return -1;
}
+ if (_warn_if_cast_exists_already(
+ descr, totype, "PyArray_RegisterCanCast") < 0) {
+ return -1;
+ }
if (scalar == NPY_NOSCALAR) {
/*
{
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;
*/
/* Convert the 'kind' char into a scalar kind */
- switch (cls->kind) {
+ switch (cls->singleton->kind) {
case 'b':
skind1 = NPY_BOOL_SCALAR;
break;
skind1 = NPY_COMPLEX_SCALAR;
break;
}
- switch (other->kind) {
+ switch (other->singleton->kind) {
case 'b':
skind2 = NPY_BOOL_SCALAR;
break;
-#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"
PyArray_AddLegacyWrapping_CastingImpl(
PyArray_DTypeMeta *from, PyArray_DTypeMeta *to, NPY_CASTING casting);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_USERTYPES_H_ */
#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"
-#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"
NPY_NO_EXPORT void
OBJECT_vdot(char *, npy_intp, char *, npy_intp, char *, npy_intp, void *);
-#endif
+#endif /* NUMPY_CORE_SRC_MULTIARRAY_VDOT_H_ */
#define NPY_NO_DEPRECATED_API NPY_API_VERSION
+
#include "numpy/halffloat.h"
/*
*/
#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 **
/**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@
#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
#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)
#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)
{
{
@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;
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;
{
@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 */
/* 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@;
}
/* 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 {
}
/**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**/
#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"
#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 */
+++ /dev/null
-#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**/
--- /dev/null
+#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);
+}
+}
-#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"
/* 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 */
--- /dev/null
+/*
+ * 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;
+}
-#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
** 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
*/
+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 };
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"
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
/**
- * 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
+++ /dev/null
-/**
- * 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**/
--- /dev/null
+/**
+ * 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);
+}
+}
--- /dev/null
+#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
+++ /dev/null
-#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
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+#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 */
-#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"
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+#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 */
/* -*- 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"
*((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);
}
}
}
*/
/**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
*/
/**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
}
-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#
* #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)))
/**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#
*/
/**end repeat**/
/**begin repeat
- * #func = rint, ceil, floor, trunc#
+ * #func = rint, floor, trunc#
*/
/**begin repeat1
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#
#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;
* #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
#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,
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};
return _mm256_loadu_si256((__m256i*) addr);
}
-static NPY_INLINE __m256
+NPY_FINLINE __m256
fma_masked_gather_ps(__m256 src,
npy_float* addr,
__m256i vindex,
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,
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)
{
/*
__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);
return _mm256_blendv_ps(exp, denorm_exp, denormal_mask);
}
-static NPY_INLINE __m256
+NPY_FINLINE __m256
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);
_mm256_castps_si256(x), mantissa_bits), exp_126_bits));
}
-static NPY_INLINE __m256
+NPY_FINLINE __m256
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,
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,
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,
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)
* #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, #
* 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);
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 */
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();
}
}
* = 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,
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));
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
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)
--- /dev/null
+/*@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**/
/*@targets
** $maxopt baseline
- ** sse2 vsx2 neon
+ ** sse2 sse41
+ ** vsx2
+ ** neon asimd
**/
/**
* Force use SSE only on x86, even if AVX2 or AVX512F are enabled
#define c_sqrt_f64 npy_sqrt
#endif
+#define c_ceil_f32 npy_ceilf
+#define c_ceil_f64 npy_ceil
+
/********************************************************************************
** Defining the SIMD kernels
********************************************************************************/
*/
#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#
* #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))
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;
}
/**
* 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
/* -*- 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"
*
* 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"
* 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,
* 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.
* 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;
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) {
/* 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 |
}
}
- 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);
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;
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) {
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;
return result;
fail:
+ NPY_AUXDATA_FREE(auxdata);
if (iter != NULL) {
NpyIter_Deallocate(iter);
}
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
* 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
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"
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);
}
#endif
return 0;
}
-
-
/**end repeat1**/
+
/**end repeat**/
/**begin repeat
*/
/**begin repeat2
- * #func = rint, floor, ceil, trunc#
+ * #func = rint, floor, trunc#
*/
#if defined @CHK@ && defined NPY_HAVE_SSE2_INTRINSICS
*/
/**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
* # 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 ... */
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 */
* 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)
{
*/
/* 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);
}
/**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)
/* 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**/
/* 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,
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};
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,
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,
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));
* #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);
#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,
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,
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);
* #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,
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)
{
/*
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
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);
#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);
* #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)
*/
/**begin repeat1
- * #func = rint, ceil, floor, trunc#
- * #vectorf = rint, ceil, floor, trunc#
+ * #func = rint, floor, trunc#
+ * #vectorf = rint, floor, trunc#
*/
#if defined @CHK@
*/
/**begin repeat1
- * #func = rint, ceil, floor, trunc#
- * #vectorf = rint, ceil, floor, trunc#
+ * #func = rint, floor, trunc#
+ * #vectorf = rint, floor, trunc#
*/
#if defined @CHK@
* 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);
--- /dev/null
+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.
--- /dev/null
+Short Vector Math Library (SVML)
+
+Provides vectorized implementations of commonly used math functions (currently
+supports only x86_64 AVX-512).
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
--- /dev/null
+/*******************************************
+* 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
* 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"
#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
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
}
/*
- * 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)
*/
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,
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]);
+ }
}
}
* -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;
}
*
* 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;
}
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. */
}
/* 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;
}
*/
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 |
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;
}
}
* 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;
}
* 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;
}
}
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;
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];
/* 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;
/* 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;
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);
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
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 |
/* 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;
/*
* 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");
}
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);
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;
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) {
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,
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;
}
/*
- * 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 */
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 {
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;
}
/*
* 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 */
}
/* Get the identity */
+ /* TODO: Both of these should be provided by the ArrayMethod! */
identity = _get_identity(ufunc, &reorderable);
if (identity == NULL) {
return NULL;
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;
}
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;
/* 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);
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 */
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,
*/
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;
}
}
- /* 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,
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
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);
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;
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];
* 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.
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);
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]);
* 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.
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;
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;
}
* 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";
/* 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);
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|
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;
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) {
}
}
+ 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.
*/
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);
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 :
* 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.
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;
}
* 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.
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;
+ }
}
}
}
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;
}
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;
}
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;
}
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;
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 */
}
/*
- * 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;
}
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) {
"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) {
"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
}
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;
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 "
}
-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) {
signature[i] = dtype;
}
Py_DECREF(dtype);
- res = _make_new_typetup(nop, signature, out_typetup);
- goto finish;
+ return 0;
}
assert(signature_obj != NULL);
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;
+ }
}
}
}
if (PyBytes_Check(signature_obj)) {
str_object = PyUnicode_FromEncodedObject(signature_obj, NULL, NULL);
if (str_object == NULL) {
- goto finish;
+ return -1;
}
}
else {
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 ||
"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) {
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]);
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;
}
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`
*/
/* 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",
}
/* 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
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);
* 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;
}
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,
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
return ufunc_generic_fastcall((PyUFuncObject *)ufunc,
args, PyVectorcall_NARGS(len_args), kwnames, NPY_FALSE);
}
-#endif /* PY_VERSION_HEX >= 0x03080000 */
NPY_NO_EXPORT PyObject *
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 = "?";
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;
}
arg_typenums = PyArray_malloc(ufunc->nargs * sizeof(int));
if (arg_typenums == NULL) {
+ Py_DECREF(key);
PyErr_NoMemory();
return -1;
}
PyArray_Descr *descr;
PyUFunc_Loop1d *funcdata;
PyObject *key, *cobj;
+ PyArray_DTypeMeta *signature[NPY_MAXARGS];
+ PyObject *signature_tuple = NULL;
int i;
int *newtypes=NULL;
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;
/* 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) {
fail:
Py_DECREF(key);
+ Py_XDECREF(signature_tuple);
PyArray_free(funcdata);
PyArray_free(newtypes);
if (!PyErr_Occurred()) PyErr_NoMemory();
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);
}
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 */
int buffersize;
int errormask = 0;
char * err_msg = NULL;
+
+ PyArrayMethod_StridedLoop *strided_loop;
+ NpyAuxData *auxdata = NULL;
+
NPY_BEGIN_THREADS_DEF;
if (ufunc->nin > 2) {
/*
* 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;
}
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;
}
* 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.
/* 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;
}
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 {
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;
}
static PyObject *
-ufunc_get_doc(PyUFuncObject *ufunc)
+ufunc_get_doc(PyUFuncObject *ufunc, void *NPY_UNUSED(ignored))
{
static PyObject *_sig_formatter;
PyObject *doc;
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;
}
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;
.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 */
/*
+ * 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"
#include "cblasfuncs.h"
#endif
+#include <stdbool.h>
+
static PyObject *
npy_casting_to_py_object(NPY_CASTING casting)
{
/** 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",
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;
return -1;
}
+
static int
raise_casting_error(
PyObject *exc_type,
}
+/*
+ * 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
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 &&
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;
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,
* `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
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,
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.
*
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
/* -*- 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"
#include "numpy/npy_math.h"
#include "number.h"
+#include "dispatching.h"
static PyUFuncGenericFunction pyfunc_functions[] = {PyUFunc_On_Om};
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;
}
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;
}
--- /dev/null
+#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;
+}
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
import pickle
+import pytest
import numpy as np
_ArrayMemoryError = np.core._exceptions._ArrayMemoryError
# 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'
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
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)
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":
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)
# 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)
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
# 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]
-# -*- coding: utf-8 -*-
import sys
import gc
from hypothesis import given
import pytest
import textwrap
import enum
-import itertools
import random
import numpy as np
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"])
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
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)
+
def test_dispatcher():
"""
- Testing the utilites of the CPU dispatcher
+ Testing the utilities of the CPU dispatcher
"""
targets = (
"SSE2", "SSE41", "AVX2",
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
)
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",
--- /dev/null
+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")
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
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') !=
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):
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)
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(
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"
*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)
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")
--- /dev/null
+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__()
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),
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):
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())
('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):
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
('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'],
'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),
'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]')])
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
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
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]
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)
""" Test functions for limits module.
"""
+import warnings
import numpy as np
from numpy.core import finfo, iinfo
from numpy import half, single, double, longdouble
[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')
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']:
--- /dev/null
+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)
)
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)
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
--- /dev/null
+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()
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
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/
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):
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):
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:
([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:
([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:
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:
# 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_)
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
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):
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
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),
_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):
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
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
)
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
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
# Note that resetting does not free references
del it
+ break_cycles()
+ break_cycles()
assert count == sys.getrefcount(value)
# Repeat the test with `iternext`
it.iternext()
del it # should ensure cleanup
+ break_cycles()
+ break_cycles()
assert count == sys.getrefcount(value)
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:
)
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
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
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'))
# 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])
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*
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)
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)
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):
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):
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
except NameError:
RecursionError = RuntimeError # python < 3.5
+
+
class TestRegression:
def test_invalid_round(self):
# Ticket #3
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)
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)
"""
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
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
-# -*- coding: utf-8 -*-
""" Test printing of scalar types.
"""
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,
# 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
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:
-# -*- coding: utf-8 -*-
""" Test printing of scalar types.
"""
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:
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
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:
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):
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)
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)
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
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)
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)]:
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)
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]
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.
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])
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)])
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
# 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)
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():
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."""
# 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):
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
# 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):
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
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):
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
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.)
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])
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.))
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():
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)
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]
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'):
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])
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)
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:
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
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
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))
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):
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)
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):
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)
import numpy as np
-import platform
+import os
from os import path
import sys
import pytest
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 ('$', '#'))
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.")
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])
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)
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):
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
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
-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`
--- /dev/null
+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')
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
# 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.
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
-------
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):
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
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()
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
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]] \
"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'),
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`,
# native usually works only with x86
native = '-march=native',
opt = '-O3',
- werror = '-Werror'
+ werror = '-Werror',
),
clang = dict(
native = '-march=native',
# 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(
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 = {},
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
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=[]):
)
@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)
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)
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
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:
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:
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)
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,))
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 = []
# 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')
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, \
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:
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:
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=False)
- except EnvironmentError:
+ except OSError:
# Return 127, as os.spawn*() and /bin/sh do
return 127, ''
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,):
# 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 []
('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',)),
--- /dev/null
+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())
+
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):
# 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,
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
os.remove(output)
finally:
os.remove(filename)
- return False
if __name__ == '__main__':
'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':
-import sys
-
from numpy.distutils.fcompiler import FCompiler
compilers = ['NVHPCFCompiler']
# 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)
# 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
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.
# 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++']
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
# 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
import textwrap
import importlib.util
from threading import local as tlocal
+from functools import reduce
import distutils
from distutils.errors import DistutilsError
'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']
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)
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."""
#########################
-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.
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
--------
_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.
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
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
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.
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,
'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'
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'
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*'])
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')
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')
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))
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",
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
--- /dev/null
+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}"
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')
import os
import sys
import subprocess
+import shlex
from distutils.errors import CompileError, DistutilsExecError, LibError
from distutils.unixccompiler import UnixCCompiler
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)
# 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
-# -*- coding: utf-8 -*-
"""
=========
Constants
"""Fortran to Python Interface Generator.
"""
-__all__ = ['run_main', 'compile', 'get_include', 'f2py_testing']
+__all__ = ['run_main', 'compile', 'get_include']
import sys
import subprocess
Examples
--------
- .. include:: compile_session.dat
- :literal:
+ .. literalinclude:: ../../source/f2py/code/results/compile_session.dat
+ :language: python
"""
import tempfile
-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: ...
-# 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()
**************************************************************
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
'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
'complex_double': 'NPY_CDOUBLE',
'complex_long_double': 'NPY_CDOUBLE',
'string':'NPY_STRING'
-
}
+
c2pycode_map = {'double': 'd',
'float': 'f',
'long_double': 'd', # forced casting
'complex_long_double': 'D', # forced casting
'string': 'c'
}
+
if using_newcore:
c2pycode_map = {'double': 'd',
'float': 'f',
'complex_double': 'D',
'complex_long_double': 'G',
'string': 'S'}
+
c2buildvalue_map = {'double': 'd',
'float': 'f',
'char': 'b',
'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',
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(
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
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
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'
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;
'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#@{}}
'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:',
'string.h', 'GETSCALARFROMPYTUPLE', '#ctype#'],
'_check': iscomplexfunction
},
- {'docstrout': '\t\t#pydocsignout#',
+ {'docstrout': ' #pydocsignout#',
'latexdocstrout': ['\\item[]{{}\\verb@#pydocsignout#@{}}',
{hasnote: '--- #note#'}],
'docreturn': '#rname#,',
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#@{}}',
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
'latexdocstr': ar['latexdocstr'],
'argname': rd['argname']
}
- outmess('\t %s\n' % (ar['docstrshort']))
+ outmess(' %s\n' % (ar['docstrshort']))
return
################## Build call-back function #############
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"'''
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;\\
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;\\
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;\\
};\\
"""
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 {\\
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']
}"""
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);
}
"""
-
needs['char_from_pyobj'] = ['int_from_pyobj']
cfuncs['char_from_pyobj'] = """\
static int
The above may be solved by creating appropriate preprocessor program, for example.
"""
-import io
import sys
import string
import fileinput
# 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
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',
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
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]:
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):
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
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)
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, []) \
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)
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:
pass
vars[n]['kindselector']['kind'] = l
- savelindims = {}
+ dimension_exprs = {}
if 'attrspec' in vars[n]:
attr = vars[n]['attrspec']
attr.reverse()
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:
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']
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']['*'],
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'] = []
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', '')
def analyzeargs(block):
setmesstext(block)
- implicitrules, attrrules = buildimplicitrules(block)
+ implicitrules, _ = buildimplicitrules(block)
if 'args' not in block:
block['args'] = []
args = []
"""
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
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:
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):
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:
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)
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
Examples
--------
- .. include:: run_main_session.dat
- :literal:
+ .. literalinclude:: ../../source/f2py/code/results/run_main_session.dat
+ :language: python
"""
crackfortran.reset_global_f2py_vars()
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(
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')
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)]
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#
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
}
'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',
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
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)): '''
{
'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
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)): '''
{
'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
{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))
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'},
}, { # 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
}
]
'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)),
},
{
},
# 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
'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,
},
},
# 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))
'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)
}, {
# ...
# 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
'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#',
'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#',
'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': '',
}, {
'_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': ''
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#)*/',
}
]
"""
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)
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(
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(
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'])
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']))
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 #############
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)
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
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',
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)
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();
/*
* 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 {
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);
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 {
/************************* 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);
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;
}
/* 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) {
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));
p += n;
size -= n;
}
-
}
if (size <= 1) {
goto fail;
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;
}
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()) {
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);
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;
}
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) {
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;
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 *******************************/
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 *******************************/
/*
* $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
* -----------------------------
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;
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;
}
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;
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);
}
}
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)) {
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",
}
{
- 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);
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
*
* 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;
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) {
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) {
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",
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;
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");
}
#ifdef DEBUG_COPY_ND_ARRAY
printf("check_and_fix_dimensions:end: dims=");
- dump_dims(rank,dims);
+ dump_dims(rank, dims);
#endif
return 0;
}
/************************* 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);
extern "C" {
#endif
-#include "Python.h"
+#include <Python.h>
#ifdef FORTRANOBJECT_C
#define NO_IMPORT_ARRAY
#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
#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
#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
+++ /dev/null
-# -*- 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_*
+++ /dev/null
- 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
+++ /dev/null
- 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
+++ /dev/null
-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
-
-
-
-
+++ /dev/null
-/* 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
+++ /dev/null
- 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
--- /dev/null
+"""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)
#endif
/*********************** See f2py2e/cfuncs.py: includes ***********************/
-#include "Python.h"
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
#include "fortranobject.h"
#include <math.h>
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;
import threading
import traceback
import time
-import random
import numpy as np
from numpy.testing import assert_, assert_equal, IS_PYPY
-----
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)
+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
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:
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 = """
r = self.module.external_as_attribute(incr)
assert r == 123
+
class TestCrackFortran(util.F2PyTest):
suffix = '.f90'
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')"
#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
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)
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)
import os
import pytest
-
+import textwrap
from numpy.testing import assert_array_equal
import numpy as np
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)
--- /dev/null
+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)}
pass
try:
shutil.rmtree(_module_dir)
- except (IOError, OSError):
+ except OSError:
pass
_module_dir = None
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
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
* 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) \
--- /dev/null
+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]: ...
--- /dev/null
+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]]: ...
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)
import math as math
from typing import Any, List
+from numpy._pytesttester import PytestTester
+
from numpy import (
ndenumerate as ndenumerate,
ndindex as ndindex,
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,
recfromtxt as recfromtxt,
recfromcsv as recfromcsv,
load as load,
- loads as loads,
save as save,
savez as savez,
savez_compressed as savez_compressed,
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
# 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)
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):
Returns
-------
- decoded_line : unicode
- Unicode in Python 2, a str (unicode) in Python 3.
+ decoded_line : str
"""
if type(line) is bytes:
-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]: ...
-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]: ...
-import sys
from typing import (
List,
Any,
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.
"""
import numpy
-import io
import warnings
from numpy.lib.utils import safe_eval
from numpy.compat import (
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
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
------
ValueError
If the data or the mode is invalid.
- IOError
+ OSError
If the file is not found or cannot be opened correctly.
See Also
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"
-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]
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,
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(
'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,)
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
--------
>>> 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)
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.
>>> 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
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`.
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``.
period: float, optional
Size of the range over which the input wraps. By default, it is
``2 pi``.
-
+
.. versionadded:: 1.21.0
Returns
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
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
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))
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
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
"""
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))
"""
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))
"""
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))
"""
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))
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
"""
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))
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.
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
.. versionadded:: 1.9.0
+ interpolation : str, optional
+ Deprecated name for the method keyword argument.
+
+ .. deprecated:: 1.22.0
+
Returns
-------
percentile : scalar or ndarray
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
--------
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::
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.
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
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
--------
>>> 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:
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):
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
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
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
.. 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
'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]
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)
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
-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 (
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]: ...
-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]]]: ...
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:
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:
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)
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)
Examples
--------
- # dimensions as individual arguments
+ Dimensions as individual arguments
+
>>> for index in np.ndindex(3, 2, 1):
... print(index)
(0, 0, 0)
(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)
-import sys
from typing import (
Any,
Tuple,
List,
Union,
Sequence,
+ Literal,
+ SupportsIndex,
)
from numpy import (
# Arrays
ArrayLike,
_NestedSequence,
- _RecursiveSequence,
+ _FiniteNestedSequence,
NDArray,
_ArrayLikeInt,
_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])
__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
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,
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
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
-------
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)
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)
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
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
-------
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)
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)
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
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
-------
"""
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
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
-------
"""
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.
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
-------
"""
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.
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
-------
"""
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):
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.
`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
-------
"""
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)
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)
)
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]
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.
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
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
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
--------
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.
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
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
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.]])
>>> 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:
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
"""
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.
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
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.
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
-------
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)
# 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
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.
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
-------
"""
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
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
-import sys
import os
import re
import functools
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
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,
)
-@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'
]
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.
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
--------
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):
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
--------
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
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
# 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.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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)
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 "
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():
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)
@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
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.
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')],
"""
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'):
----------
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.
``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
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,
)(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.
-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]]: ...
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.
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
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
-----
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
-----
The solution minimizes the squared error
- .. math ::
+ .. math::
E = \\sum_{j=0}^k |p(x_j) - y_j|^2
in the equations::
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
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:
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):
-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]]: ...
...
>>> 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
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
--------
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])
"""
--------
>>> 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 ])
"""
--------
>>> 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])
"""
-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]: ...
----------
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).
-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]]: ...
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)
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:
'''
import sys
import os
-import shutil
-import tempfile
import warnings
import pytest
from io import BytesIO
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:
([('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):
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:
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])
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:
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):
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)]
[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
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
# 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])
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
# 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)
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,
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):
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):
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)
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
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)
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)
# 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(
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,
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):
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),
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:
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))
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,
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()
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()
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')
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)
+
+
#####--------------------------------------------------------------------------
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)
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
)
[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]
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)
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:
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))
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:
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]):
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]):
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))
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"
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))
# 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]),
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):
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')
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)
-import pytest
-
import os
import numpy as np
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)
# 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)
from numpy.core.tests.test_overrides import requires_array_function
+import pytest
+
+
def get_mat(n):
data = arange(n)
data = add.outer(data, data)
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):
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
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
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
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
[ 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)
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.
[ 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)
>>> 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)
-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_]]: ...
-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]]: ...
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]):
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),
sys.stdout = old_stdout
sys.stderr = old_stderr
# Catch SystemExit, too
- except BaseException:
+ except (Exception, SystemExit):
continue
for n, v in _getmembers(item):
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.
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
# 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
-import sys
from ast import AST
from typing import (
Any,
Tuple,
TypeVar,
Union,
+ Protocol,
)
from numpy import ndarray, generic
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]
) -> _Deprecate: ...
@overload
def deprecate(
- __func: _FuncType,
+ func: _FuncType,
+ /,
old_name: Optional[str] = ...,
new_name: Optional[str] = ...,
message: Optional[str] = ...,
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=...): ...
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
-#!/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>'):
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:
return SourceLines
state = SourceLines
- for line in StringIO(source):
+ for line in UStringIO(source):
state = state(line)
comments.flushTo(lines)
return lines.getValue()
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()
return InBuiltInFunctions
state = LookingForBuiltinFunctions
- for line in StringIO(source):
+ for line in UStringIO(source):
state = state(line)
return lines.getValue()
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)
+# WARNING! This a Python 2 script. Read README.rst for rationale.
import re
import itertools
line = line.rstrip()
return line
+ next = __next__
+
class PushbackIterator:
"""PushbackIterator(iterable)
def pushback(self, item):
self.buffer.append(item)
+ next = __next__
+
def fortranSourceLines(fo):
"""Return an iterator over statement lines of a Fortran source file.
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)
-#!/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>
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
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
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')
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:
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:
def ensure_executable(name):
try:
which(name)
- except:
+ except Exception:
raise SystemExit(name + ' not found')
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:
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)
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)
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)
-#include "Python.h"
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
#include "numpy/npy_common.h"
#include "npy_cblas.h"
*/
#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;
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(
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
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
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
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
>>> 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
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
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
-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
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
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.
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
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,
>>> 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)
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
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
--- /dev/null
+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: ...
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')
+++ /dev/null
-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.""")
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
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_):
assert_raises(LinAlgError, matrix_power, mat, -1)
-
class TestEigvalshCases(HermitianTestCase, HermitianGeneralizedTestCase):
def do(self, a, b, tags):
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?
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))
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))
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)
** 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"
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,
/**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@)(¶ms->M, ¶ms->N, ¶ms->NRHS,
+ LAPACK(@lapack_func@)(¶ms->M, ¶ms->N,
params->A, ¶ms->LDA,
- params->B, ¶ms->LDB,
- params->S,
- params->RCOND, ¶ms->RANK,
+ params->TAU,
params->WORK, ¶ms->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:
/**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@)(¶ms->M, ¶ms->N, ¶ms->NRHS,
- params->A, ¶ms->LDA,
- params->B, ¶ms->LDB,
- params->S,
- params->RCOND, ¶ms->RANK,
- params->WORK, ¶ms->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:
/**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);
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@(¶ms, m, n, nrhs)) {
- LINEARIZE_DATA_t a_in, b_in, x_out, s_out, r_out;
+ if (init_@lapack_func@(¶ms, 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@(¶ms);
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
/**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@)(¶ms->M, ¶ms->MC, ¶ms->MN,
+ params->Q, ¶ms->LDA,
+ params->TAU,
+ params->WORK, ¶ms->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@(¶ms, 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@(¶ms);
+ 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@(¶ms);
+ }
+
+ 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(¶ms, 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@(¶ms);
+ 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@(¶ms);
+ }
+
+ 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@)(¶ms->M, ¶ms->N, ¶ms->NRHS,
+ params->A, ¶ms->LDA,
+ params->B, ¶ms->LDB,
+ params->S,
+ params->RCOND, ¶ms->RANK,
+ params->WORK, ¶ms->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@)(¶ms->M, ¶ms->N, ¶ms->NRHS,
+ params->A, ¶ms->LDA,
+ params->B, ¶ms->LDB,
+ params->S,
+ params->RCOND, ¶ms->RANK,
+ params->WORK, ¶ms->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@(¶ms, 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@(¶ms);
+ 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@(¶ms);
+ }
+
+ 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
};
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);
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);
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,
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)",
NULL
};
-PyObject *PyInit__umath_linalg(void)
+PyMODINIT_FUNC PyInit__umath_linalg(void)
{
PyObject *m;
PyObject *d;
from typing import Any, List
+from numpy._pytesttester import PytestTester
+
from numpy.ma import extras as extras
from numpy.ma.core import (
)
__all__: List[str]
+__path__: List[str]
+test: PytestTester
#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
import timeit
import numpy
)
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__ = [
'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_
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:
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.
"""
- @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)
_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)
_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
# 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,
"""
m = self.mean(axis, dtype)
- if m is masked:
- return m
-
if not axis:
return self - m
else:
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.
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.
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):
"""
__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
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):
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
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
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:
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)
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)
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
try:
if issubclass(dtype, ndarray):
output = ndarray.view(self, dtype)
- dtype = None
else:
output = ndarray.view(self, dtype)
# OK, there's the change
_mask = ndarray.__new__(ndarray, baseshape, 'b1')
return subtype.__new__(subtype, _data, mask=_mask, dtype=basetype,)
-
mrecarray = MaskedRecords
# 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
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`.
----------
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
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)
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()
def fromtextfile(
fname,
- delimitor=...,
+ delimiter=...,
commentchar=...,
missingchar=...,
varnames=...,
vartypes=...,
+ # NOTE: deprecated: NumPy 1.22.0, 2021-09-23
+ # delimitor=...,
): ...
def addfield(mrecord, newfield, newfieldname=...): ...
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
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))
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)
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
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],
# 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)
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")
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")
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
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.
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])
# 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)
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
"""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 """
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=';')
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])
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):
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)
-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
--- /dev/null
+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
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²
"""
from typing import List
+from numpy._pytesttester import PytestTester
+
from numpy.polynomial import (
chebyshev as chebyshev,
hermite as hermite,
from numpy.polynomial.polynomial import Polynomial as Polynomial
__all__: List[str]
+__path__: List[str]
+test: PytestTester
def set_default_printstyle(style): ...
# 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}"
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
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`.
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
#
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.
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.
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
`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`.
-----
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
.. 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
--------
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
-------
`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`.
-----
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
.. math::
- xP_i(x) = (P_{i + 1}(x) + iP_{i - 1}(x)))
+ xP_i(x) = (P_{i + 1}(x) + iP_{i - 1}(x)))
Examples
--------
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
-------
`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`.
-----
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
.. 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
--------
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
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
-------
`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`.
-----
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
See Also
--------
- legadd, legmul, legmul, legdiv, legpow
+ legadd, legmul, legdiv, legpow
Notes
-----
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
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`.
-----
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
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
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`.
------
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
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
-----
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
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)
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
)
__all__: List[str]
+__path__: List[str]
+test: PytestTester
Usage: python setup.py build_ext -i
"""
+import setuptools # triggers monkeypatching distutils
from distutils.core import setup
from os.path import dirname, join, abspath
-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_,
_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[
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,
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
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),
Raises
------
ValueError
- If a < 1.
+ If a <= 0.
Notes
-----
`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.
-----
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
--------
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()
"""
(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)
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':
----------
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
--------
>>> 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.
>>> 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
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
# 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
# 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,
-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
-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
**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
**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
-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]]
-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
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]]
import abc
-import sys
from threading import Lock
from typing import (
Any,
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[
#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 */
-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_,
_UIntCodes,
)
-if sys.version_info >= (3, 8):
- from typing import Literal
-else:
- from typing_extensions import Literal
-
_DTypeLikeFloat32 = Union[
dtype[float32],
_SupportsDType[dtype[float32]],
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
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),
Raises
------
ValueError
- If a < 1.
+ If a <= 0.
See Also
--------
`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.
-----
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
--------
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()
"""
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)
else:
msg = "sum(pvals[:-1]) > 1.0"
raise ValueError(msg)
-
if size is None:
shape = (d,)
else:
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)
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
# 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
# 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.
'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']:
}
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 */
}
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) {
}
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) {
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)) {
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).
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):
return gauss[:n]
+
def test_seedsequence():
from numpy.random.bit_generator import (ISeedSequence,
ISpawnableSeedSequence,
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)
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')
@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))
[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
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())
# 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)
# 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)
[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)
# 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)
+++ /dev/null
-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=...,
-): ...
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')
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
)
-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: ...
--- /dev/null
+"""
+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
'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',
]
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
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()
finally:
sys.settrace(original_trace)
return wrapper
-
--- /dev/null
+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: ...
config.add_subpackage('_private')
config.add_subpackage('tests')
config.add_data_files('*.pyi')
+ config.add_data_files('_private/*.pyi')
return config
if __name__ == '__main__':
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',
'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'
]
--- /dev/null
+
+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
import sys
import pytest
import weakref
+from pathlib import Path
import numpy as np
from numpy.ctypeslib import ndpointer, load_library, as_array
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
import sys
+import sysconfig
import subprocess
import pkgutil
import types
'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',
'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
# 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",
"core.fromnumeric",
"core.function_base",
"core.getlimits",
- "core.machar",
"core.memmap",
"core.multiarray",
"core.numeric",
"core.shape_base",
"core.umath",
"core.umath_tests",
+ "distutils.armccompiler",
"distutils.ccompiler",
'distutils.ccompiler_opt',
"distutils.command",
"distutils.extension",
"distutils.fcompiler",
"distutils.fcompiler.absoft",
+ "distutils.fcompiler.arm",
"distutils.fcompiler.compaq",
"distutils.fcompiler.environment",
"distutils.fcompiler.g95",
"f2py.f90mod_rules",
"f2py.func2subr",
"f2py.rules",
+ "f2py.symbolic",
"f2py.use_rules",
"fft.helper",
"lib.arraypad",
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
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()}"
+ )
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
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
--------------------------------------
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
~~~~~~~~~
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
---
# 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"]
#
# 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()
# 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,
from ._array_like import (
ArrayLike as ArrayLike,
_ArrayLike,
- _NestedSequence,
- _RecursiveSequence,
+ _FiniteNestedSequence,
_SupportsArray,
_ArrayLikeInt,
_ArrayLikeBool_co,
)
from ._generic_alias import (
NDArray as NDArray,
+ _DType,
_GenericAlias,
)
_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
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:
* (Nested) sequences.
* Objects implementing the `~class.__array__` protocol.
+ .. versionadded:: 1.20
+
See Also
--------
:term:`array_like`:
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:
* 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
--------
Can be used during runtime for typing arrays with a given dtype
and unspecified shape.
+ .. versionadded:: 1.21
+
Examples
--------
.. code-block:: python
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,
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],
]
# 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`
"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,
+++ /dev/null
-"""
-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
--- /dev/null
+"""
+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_]: ...
-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]",
+]
-import sys
from typing import (
Any,
List,
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,
_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]
# 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,
_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,
_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,
_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,
_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,
]
_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,
]
-"""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 (
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__`.
return super().__getattribute__("_origin")
@property
- def __args__(self) -> Tuple[Any, ...]:
+ def __args__(self) -> Tuple[object, ...]:
return super().__getattribute__("_args")
@property
"""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__)
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,)
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))
--- /dev/null
+"""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
-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, ...]
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
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]
__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]):
__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
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 = ...,
array: ArrayLike,
axis: SupportsIndex = ...,
dtype: DTypeLike = ...,
- out: Optional[NDArray[Any]] = ...,
+ out: None | NDArray[Any] = ...,
) -> NDArray[Any]: ...
def reduceat(
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]: ...
__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]]: ...
__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
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]]: ...
__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: ...
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]: ...
-"""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
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),
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",
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:
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`.
"""
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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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),
- }
-)
--- /dev/null
+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),
+ }
+)
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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__"
--- /dev/null
+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__"
+++ /dev/null
-"""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
--- /dev/null
+"""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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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)
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-from numpy.lib import NumpyVersion
-
-version: NumpyVersion
-
-NumpyVersion(b"1.8.0") # E: incompatible type
-version >= b"1.8.0" # E: Unsupported operand types
--- /dev/null
+from numpy.lib import NumpyVersion
+
+version: NumpyVersion
+
+NumpyVersion(b"1.8.0") # E: incompatible type
+version >= b"1.8.0" # E: Unsupported operand types
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-"""
-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
--- /dev/null
+"""
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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]]"
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-"""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
--- /dev/null
+"""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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
-)
--- /dev/null
+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
+++ /dev/null
-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())
--- /dev/null
+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())
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
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
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
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
import sys
-from typing import List, Any
+from typing import Any
import numpy as np
-from typing import Any, List, Optional
+from typing import Any, Optional
import numpy as np
from numpy.typing import ArrayLike, _SupportsArray
from __future__ import annotations
-from typing import List, Any
+from typing import Any
import numpy as np
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: ...
-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)
np.dtype((np.int32, (np.int8, 4)))
-# Dtype comparision
+# Dtype comparison
np.dtype(float) == float
np.dtype(float) != np.float64
np.dtype(float) < None
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)
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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]
--- /dev/null
+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]]
--- /dev/null
+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}]]
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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}]]]
+++ /dev/null
-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}]]
--- /dev/null
+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}]]
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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_]]
--- /dev/null
+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_]]
+++ /dev/null
-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_]]
--- /dev/null
+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_]]
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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]]
+++ /dev/null
-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]
--- /dev/null
+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]
+++ /dev/null
-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]
--- /dev/null
+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]
+++ /dev/null
-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]
--- /dev/null
+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]
--- /dev/null
+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}]]
+++ /dev/null
-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}]]
--- /dev/null
+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}]]
+++ /dev/null
-"""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
--- /dev/null
+"""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
--- /dev/null
+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
--- /dev/null
+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]]]]
+++ /dev/null
-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_}]]]
--- /dev/null
+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_}]]]
--- /dev/null
+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}]]
--- /dev/null
+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]]]
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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]
--- /dev/null
+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]]
+++ /dev/null
-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]]]]
--- /dev/null
+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]]]]
+++ /dev/null
-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]
--- /dev/null
+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]
+++ /dev/null
-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
--- /dev/null
+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]
+++ /dev/null
-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}
--- /dev/null
+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}
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-"""
-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
--- /dev/null
+"""
+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
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-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]
--- /dev/null
+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]
--- /dev/null
+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
--- /dev/null
+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]]
+++ /dev/null
-"""
-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
--- /dev/null
+"""
+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
+++ /dev/null
-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']
--- /dev/null
+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']
+++ /dev/null
-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_}]]
--- /dev/null
+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_}]]
--- /dev/null
+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"],
+))
+++ /dev/null
-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}
--- /dev/null
+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]
--- /dev/null
+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]]
--- /dev/null
+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]]]
--- /dev/null
+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
--- /dev/null
+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_}]]]
--- /dev/null
+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}]
+++ /dev/null
-"""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]
--- /dev/null
+"""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]
+++ /dev/null
-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_]]
--- /dev/null
+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_]]
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+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
@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__),
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",
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
@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
@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
+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
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")
#: 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.
"""
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)
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):
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:
@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:
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()}
"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']}]",
"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
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)
@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"}
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)
+++ /dev/null
-"""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()}"
- )
-
+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
#-----------------------------------
# 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'
#-------------------------------------------------------
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
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])
'--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.
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')
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()}
+[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.
# 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
# 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]),
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
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):
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'],
},
)
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"
#!/usr/bin/env python3
-# -*- encoding:utf-8 -*-
"""
Script to generate contributor and pull request lists
DEFAULT_ROOT = 'numpy'
VENDOR = 'NumPy'
-# WindowsError is not defined on unix systems
-try:
- WindowsError
-except NameError:
- WindowsError = None
-
#
# 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:
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()
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):
#!/usr/bin/env python3
-# -*- encoding:utf-8 -*-
"""
Script to download NumPy wheels from the Anaconda staging area.
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
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}
# -----------------------------------------------------------------------------
[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
# computing the diff itself.
EXCLUDE = (
"numpy/typing/tests/data/",
+ "numpy/typing/_char_codes.py",
"numpy/__config__.py",
+ "numpy/f2py",
)
--- /dev/null
+#!/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
--- /dev/null
+#!/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}
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 = [
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
--- /dev/null
+#!/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}`
# 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.
'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',
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)
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)
results = []
_, short_name = os.path.split(fname)
- if short_name in DOCTEST_SKIPLIST:
+ if short_name in DOCTEST_SKIPDICT:
return results
full_name = fname
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"
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"
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"
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"
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"
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"
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)
######################################################################
# 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
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
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
--- /dev/null
+
+----
+
+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>.
--- /dev/null
+
+----
+
+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>.
--- /dev/null
+#!/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()
--- /dev/null
+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
--- /dev/null
+# 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
# _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
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)