Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

MAINT: Add stand-alone libnpymath and remove dependency to numpy from npyrandom #25390

Draft
wants to merge 20 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
9b6d920
MAINT: Remove npy dependency from npyrandom and ship sources
lysnikolaou Dec 13, 2023
c69465f
Fix types
lysnikolaou Dec 14, 2023
e764f44
Fix typedefs
lysnikolaou Dec 14, 2023
b9d83e8
Merge branch 'main' into remove-npyrandom-staticlib
lysnikolaou Dec 18, 2023
731fc5b
Use stand-alone libnpymath and remove npymath from numpy source
lysnikolaou Dec 18, 2023
04965fe
Update libnpymath to fix test failures
lysnikolaou Dec 21, 2023
2f8f8a1
Remove lysnikolaou/libnpymath submodule
lysnikolaou Jan 11, 2024
0c504ce
Add numpy/libnpymath submodule
lysnikolaou Jan 11, 2024
e4fe09b
Merge branch 'main' into remove-npyrandom-staticlib
lysnikolaou Jan 19, 2024
882b6b1
Update libnpymath to fix have_features detection
lysnikolaou Jan 19, 2024
2b5da14
Merge branch 'main' into remove-npyrandom-staticlib
lysnikolaou Feb 2, 2024
d89bd07
Add libnpymath dep in fft module
lysnikolaou Feb 2, 2024
511c1cc
Update libnpymath to get fixes for FreeBSD
lysnikolaou Feb 2, 2024
5b2cc62
Add libnpymath dependency to f2py's meson.build
lysnikolaou Feb 6, 2024
91055f2
Change npy_creal/npy_cimag to get pointers
lysnikolaou Feb 5, 2024
2284c17
Pull libnpymath changes & change includes / calls to new symbols
lysnikolaou Feb 8, 2024
c962c6c
Merge branch 'main' into remove-npyrandom-staticlib
lysnikolaou Feb 9, 2024
e90dcc7
Merge branch 'main' into remove-npyrandom-staticlib
lysnikolaou Feb 27, 2024
0078aaa
Mark test_cffi as xfail
lysnikolaou Feb 27, 2024
dec8bac
Update to use new version of libnpymath
lysnikolaou Feb 27, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge branch 'main' into remove-npyrandom-staticlib
  • Loading branch information
lysnikolaou committed Feb 27, 2024
commit e90dcc7a0a7e20ef83eedbe7352f171a74ba729c
8 changes: 8 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
root = true

[*.{c,cxx,h,hpp}]
# https://numpy.org/neps/nep-0045-c_style_guide.html
indent_size = 4
indent_style = space
max_line_length = 80
trim_trailing_whitespace = true
1 change: 0 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ numpy/version.py linguist-generated
# F2py
./doc/source/f2py/*.pyf text
./doc/source/f2py/*.dat text
./numpy/f2py/tests/src/module_data/mod.mod binary

# Documents
*.md text diff=markdown
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ jobs:
- name: 'Checkout Repository'
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: 'Dependency Review'
uses: actions/dependency-review-action@4901385134134e04cec5fbe5ddfe3b2c5bd5d976 # v4.0.0
uses: actions/dependency-review-action@9129d7d40b8c12c1ed0f60400d00c92d437adcce # v4.1.3
18 changes: 10 additions & 8 deletions .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,10 @@ jobs:
set -xe
sudo apt update
sudo apt install gfortran libgfortran5
python -m pip install -r requirements/ci_requirements.txt
spin config-openblas --with-scipy-openblas=32
python -m pip install -r requirements/ci32_requirements.txt
mkdir -p ./.openblas
python -c"import scipy_openblas32 as ob32; print(ob32.get_pkg_config())" > ./.openblas/scipy-openblas.pc

- name: Build a wheel
env:
PKG_CONFIG_PATH: ${{ github.workspace }}/.openblas
Expand Down Expand Up @@ -186,15 +188,15 @@ jobs:
- uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0
with:
python-version: '3.11'
- name: Install gfortran and setup OpenBLAS (MacPython build)
- name: Install gfortran and setup OpenBLAS (sdist build)
run: |
set -xe
sudo apt update
sudo apt install gfortran libgfortran5
target=$(python tools/openblas_support.py)
sudo cp -r $target/lib/* /usr/lib
sudo cp $target/include/* /usr/include
python -m pip install -r requirements/ci_requirements.txt
mkdir -p ./.openblas
python -c"import scipy_openblas64 as ob64; print(ob64.get_pkg_config())" > ./.openblas/scipy-openblas.pc
- name: Build a wheel via an sdist
env:
PKG_CONFIG_PATH: ${{ github.workspace }}/.openblas
run: |
pip install build
python -m build
Expand Down
21 changes: 15 additions & 6 deletions .github/workflows/linux_blas.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,16 @@ jobs:
run: |
pip install -r requirements/build_requirements.txt
# Install OpenBLAS
set -xe
if [[ $USE_NIGHTLY_OPENBLAS == "true" ]]; then
target=$(python tools/openblas_support.py --nightly)
python -m pip install -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple scipy-openblas32
else
target=$(python tools/openblas_support.py)
python -m pip install -r requirements/ci32_requirements.txt
fi
sudo cp -r $target/lib/* /usr/lib
sudo cp $target/include/* /usr/include
mkdir -p ./.openblas
python -c"import scipy_openblas32 as ob32; print(ob32.get_pkg_config())" > ./.openblas/scipy-openblas.pc
echo "PKG_CONFIG_PATH=${{ github.workspace }}/.openblas" >> $GITHUB_ENV
ld_library_path=$(python -c"import scipy_openblas32 as ob32; print(ob32.get_lib_dir())")
echo "LD_LIBRARY_PATH=$ld_library_path" >> $GITHUB_ENV

- name: Build
shell: 'script -q -e -c "bash --noprofile --norc -eo pipefail {0}"'
Expand All @@ -98,12 +100,15 @@ jobs:
- name: Check installed test and stub files
run:
python tools/check_installed_files.py $(find ./build-install -path '*/site-packages/numpy')
- name: Ensure scipy-openblas
run: |
set -ex
spin python tools/check_openblas_version.py 0.3.26

- name: Test
shell: 'script -q -e -c "bash --noprofile --norc -eo pipefail {0}"'
env:
TERM: xterm-256color
LD_LIBRARY_PATH: "/usr/local/lib/" # to find libopenblas.so.0

run: |
pip install pytest pytest-xdist hypothesis typing_extensions
Expand Down Expand Up @@ -197,6 +202,7 @@ jobs:
run: |
pip install -r requirements/build_requirements.txt
pip install pytest pytest-xdist hypothesis typing_extensions
sudo apt-get update
sudo apt-get install libopenblas-dev cmake
sudo apt-get remove pkg-config

Expand All @@ -223,6 +229,7 @@ jobs:
- name: Install dependencies
run: |
pip install -r requirements/build_requirements.txt
sudo apt-get update
sudo apt-get install liblapack-dev pkg-config

- name: Build
Expand Down Expand Up @@ -346,6 +353,7 @@ jobs:
run: |
pip install -r requirements/build_requirements.txt
pip install pytest pytest-xdist hypothesis typing_extensions
sudo apt-get update
sudo apt-get install libblis-dev libopenblas-dev pkg-config

- name: Add BLIS pkg-config file
Expand Down Expand Up @@ -381,6 +389,7 @@ jobs:
run: |
pip install -r requirements/build_requirements.txt
pip install pytest pytest-xdist hypothesis typing_extensions
sudo apt-get update
sudo apt-get install libatlas-base-dev pkg-config

- name: Build
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/linux_compiler_sanitizers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ jobs:
run: |
pip install pytest pytest-xdist hypothesis typing_extensions
ASAN_OPTIONS=detect_leaks=0:symbolize=1:strict_init_order=true:allocator_may_return_null=1:halt_on_error=1 \
UBSAN_OPTIONS=halt_on_error=0 \
LD_PRELOAD=$(gcc --print-file-name=libasan.so) \
python -m spin test -- -v -s


14 changes: 11 additions & 3 deletions .github/workflows/macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
${{ github.workflow }}-${{ matrix.python-version }}-ccache-macos-

- name: Setup Mambaforge
uses: conda-incubator/setup-miniconda@11b562958363ec5770fef326fe8ef0366f8cbf8a # v3.0.1
uses: conda-incubator/setup-miniconda@392cf345b1784333caa1a1185081c71e6ffd61bc # v3.0.2
with:
python-version: ${{ matrix.python-version }}
channels: conda-forge
Expand Down Expand Up @@ -99,10 +99,17 @@ jobs:
conda activate numpy-dev
ccache -s


accelerate:
name: Accelerate (LP64, ILP64)
name: Accelerate (LP64, ILP64) - ${{ matrix.build_runner[1] }}
if: "github.repository == 'numpy/numpy'"
runs-on: macos-13
runs-on: ${{ matrix.build_runner[0] }}
strategy:
matrix:
build_runner:
- [ macos-13, "macos_x86_64" ]
- [ macos-14, "macos_arm64" ]

steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
Expand All @@ -114,6 +121,7 @@ jobs:
python-version: '3.10'

- uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
if: ${{ matrix.build_runner[0] == 'macos-13' }}
with:
xcode-version: '14.3'

Expand Down
13 changes: 10 additions & 3 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,14 @@ jobs:

- name: pkg-config-for-win
run: |
choco install -y --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite
choco install -y --no-progress --stoponfirstfailure --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite
$CIBW = "${{ github.workspace }}/.openblas"
# pkgconfig needs a complete path, and not just "./openblas since the
# build is run in a tmp dir (?)
# It seems somewhere in the env passing, `\` is not
# passed through, so convert it to '/'
$CIBW = $CIBW.replace("\","/")
echo "CIBW_ENVIRONMENT_WINDOWS=PKG_CONFIG_PATH=$CIBW" >> $env:GITHUB_ENV
if: runner.os == 'windows'

# Used to push the built wheels
Expand All @@ -126,7 +133,7 @@ jobs:
name: ${{ matrix.python }}-${{ startsWith(matrix.buildplat[1], 'macosx') && 'macosx' || matrix.buildplat[1] }}
path: ./wheelhouse/*.whl

- uses: conda-incubator/setup-miniconda@11b562958363ec5770fef326fe8ef0366f8cbf8a # v3.0.1
- uses: conda-incubator/setup-miniconda@392cf345b1784333caa1a1185081c71e6ffd61bc # v3.0.2
with:
# for installation of anaconda-client, required for upload to
# anaconda.org
Expand Down Expand Up @@ -210,7 +217,7 @@ jobs:
name: sdist
path: ./dist/*

- uses: conda-incubator/setup-miniconda@11b562958363ec5770fef326fe8ef0366f8cbf8a # v3.0.1
- uses: conda-incubator/setup-miniconda@392cf345b1784333caa1a1185081c71e6ffd61bc # v3.0.2
with:
# for installation of anaconda-client, required for upload to
# anaconda.org
Expand Down
8 changes: 3 additions & 5 deletions .github/workflows/windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ jobs:

- name: Install pkg-config
run: |
choco install -y --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite
choco install -y --stoponfirstfailure --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite
echo "PKG_CONFIG_PATH=${{ github.workspace }}/.openblas" >> $env:GITHUB_ENV


- name: Install Clang-cl
if: matrix.compiler == 'Clang-cl'
Expand All @@ -48,16 +50,12 @@ jobs:

- name: Install NumPy (MSVC)
if: matrix.compiler == 'MSVC'
env:
PKG_CONFIG_PATH: ${{ github.workspace }}/.openblas
run: |
pip install -r requirements/ci_requirements.txt
spin build --with-scipy-openblas=32 -j2 -- --vsenv

- name: Install NumPy (Clang-cl)
if: matrix.compiler == 'Clang-cl'
env:
PKG_CONFIG_PATH: ${{ github.workspace }}/.openblas
run: |
"[binaries]","c = 'clang-cl'","cpp = 'clang-cl'","ar = 'llvm-lib'","c_ld = 'lld-link'","cpp_ld = 'lld-link'" | Out-File $PWD/clang-cl-build.ini -Encoding ascii
pip install -r requirements/ci_requirements.txt
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ GTAGS
*.o.d
*.py[ocd]
*.so
*.mod

# Packages #
############
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
[submodule "numpy/_core/src/highway"]
path = numpy/_core/src/highway
url = https://github.com/google/highway.git
[submodule "numpy/fft/pocketfft"]
path = numpy/fft/pocketfft
url = https://github.com/mreineck/pocketfft
[submodule "subprojects/libnpymath"]
path = subprojects/libnpymath
url = https://github.com/numpy/libnpymath.git
2 changes: 1 addition & 1 deletion .spin/cmds.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ def _config_openblas(blas_variant):
os.makedirs(openblas_dir, exist_ok=True)
with open(pkg_config_fname, "wt", encoding="utf8") as fid:
fid.write(
openblas.get_pkg_config(use_preloading=True).replace("\\", "/")
openblas.get_pkg_config(use_preloading=True)
)


Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ https://anaconda.org/conda-forge/numpy)
https://stackoverflow.com/questions/tagged/numpy)
[![Nature Paper](https://img.shields.io/badge/DOI-10.1038%2Fs41586--020--2649--2-blue)](
https://doi.org/10.1038/s41586-020-2649-2)
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/numpy/numpy/badge)](https://api.securityscorecards.dev/projects/github.com/numpy/numpy)
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/numpy/numpy/badge)](https://securityscorecards.dev/viewer/?uri=github.com/numpy/numpy)


NumPy is the fundamental package for scientific computing with Python.
Expand Down
6 changes: 3 additions & 3 deletions azure-steps-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ steps:
displayName: 'Install dependencies; some are optional to avoid test skips'

- powershell: |
choco install unzip -y
choco install -y --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite
choco install ninja
choco install -y --stoponfirstfailure unzip
choco install -y --stoponfirstfailure --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite
choco install --stoponfirstfailure ninja
echo "##vso[task.setvariable variable=RTOOLS43_HOME]c:\rtools43"
displayName: 'Install utilities'

Expand Down
8 changes: 4 additions & 4 deletions doc/DISTUTILS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ SciPy packages should be kept minimal or zero.
A SciPy package contains, in addition to its sources, the following
files and directories:

+ ``setup.py`` --- building script
+ ``__init__.py`` --- package initializer
+ ``tests/`` --- directory of unittests
+ ``setup.py`` --- building script
+ ``__init__.py`` --- package initializer
+ ``tests/`` --- directory of unittests

Their contents are described below.

Expand Down Expand Up @@ -594,7 +594,7 @@ Specifying config_fc options for libraries in setup.py script
-------------------------------------------------------------

It is possible to specify config_fc options in setup.py scripts.
For example, using
For example, using::

config.add_library('library',
sources=[...],
Expand Down
8 changes: 4 additions & 4 deletions doc/changelog/1.20.0-changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ A total of 716 pull requests were merged for this release.
* `#16472 <https://github.com/numpy/numpy/pull/16472>`__: DOC: Fixes for 18 broken links
* `#16474 <https://github.com/numpy/numpy/pull/16474>`__: MAINT: use zip instead of range in piecewise
* `#16476 <https://github.com/numpy/numpy/pull/16476>`__: ENH: add ``norm=forward,backward`` to numpy.fft functions
* `#16482 <https://github.com/numpy/numpy/pull/16482>`__: SIMD: Optimize the performace of np.packbits in ARM-based machine.
* `#16482 <https://github.com/numpy/numpy/pull/16482>`__: SIMD: Optimize the performance of np.packbits in ARM-based machine.
* `#16485 <https://github.com/numpy/numpy/pull/16485>`__: BUG: Fix result when a gufunc output broadcasts the inputs.
* `#16500 <https://github.com/numpy/numpy/pull/16500>`__: DOC: Point Contributing page to new NEP 45
* `#16501 <https://github.com/numpy/numpy/pull/16501>`__: MAINT: make Py_SET_SIZE and Py_SET_TYPE macros a bit safer
Expand Down Expand Up @@ -487,7 +487,7 @@ A total of 716 pull requests were merged for this release.
* `#16890 <https://github.com/numpy/numpy/pull/16890>`__: TST, BUG: Re-raise MemoryError exception in test_large_zip's...
* `#16894 <https://github.com/numpy/numpy/pull/16894>`__: DOC: Fix wrong markups in ``arrays.dtypes``
* `#16896 <https://github.com/numpy/numpy/pull/16896>`__: DOC: Remove links for C codes
* `#16897 <https://github.com/numpy/numpy/pull/16897>`__: DOC: Fix the declarations of C fuctions
* `#16897 <https://github.com/numpy/numpy/pull/16897>`__: DOC: Fix the declarations of C functions
* `#16899 <https://github.com/numpy/numpy/pull/16899>`__: MNT: also use Py_SET_REFCNT instead of Py_REFCNT
* `#16900 <https://github.com/numpy/numpy/pull/16900>`__: MAINT: Chaining exceptions in numpy/__init__.py
* `#16907 <https://github.com/numpy/numpy/pull/16907>`__: DOC: update val to be scalar or array like optional closes #16901
Expand Down Expand Up @@ -737,7 +737,7 @@ A total of 716 pull requests were merged for this release.
* `#17493 <https://github.com/numpy/numpy/pull/17493>`__: DOC: New round of NEP 42 edits
* `#17497 <https://github.com/numpy/numpy/pull/17497>`__: DOC: Use consistent lowercase on docs landing page
* `#17498 <https://github.com/numpy/numpy/pull/17498>`__: MAINT: fix incompatible type comparison in numpy.lib.utils.info
* `#17501 <https://github.com/numpy/numpy/pull/17501>`__: BUG: Fix failures in master related to userdtype registeration
* `#17501 <https://github.com/numpy/numpy/pull/17501>`__: BUG: Fix failures in master related to userdtype registration
* `#17502 <https://github.com/numpy/numpy/pull/17502>`__: BUG: remove ``sys`` from the type stubs
* `#17503 <https://github.com/numpy/numpy/pull/17503>`__: DOC: Fix empty 'C style guide' page
* `#17504 <https://github.com/numpy/numpy/pull/17504>`__: DOC: Rename 'Quickstart tutorial'
Expand Down Expand Up @@ -902,7 +902,7 @@ A total of 716 pull requests were merged for this release.
* `#18127 <https://github.com/numpy/numpy/pull/18127>`__: REL: Update 1.20.x after 1.19.5 release.
* `#18130 <https://github.com/numpy/numpy/pull/18130>`__: BUG: Fix promotion of half and string
* `#18146 <https://github.com/numpy/numpy/pull/18146>`__: BUG, MAINT: improve avx512 mask logical operations
* `#18154 <https://github.com/numpy/numpy/pull/18154>`__: BUG: Promotion between strings and objects was assymetric
* `#18154 <https://github.com/numpy/numpy/pull/18154>`__: BUG: Promotion between strings and objects was asymmetric
* `#18192 <https://github.com/numpy/numpy/pull/18192>`__: MAINT: Use explicit reexports for numpy.typing objects
* `#18201 <https://github.com/numpy/numpy/pull/18201>`__: BUG: Keep ignoring most errors during array-protocol lookup
* `#18219 <https://github.com/numpy/numpy/pull/18219>`__: MAINT: random shuffle: warn on unrecognized objects, fix empty...
Expand Down
2 changes: 1 addition & 1 deletion doc/neps/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
language = "en"

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
Expand Down
2 changes: 0 additions & 2 deletions doc/neps/nep-0050-scalar-promotion.rst
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,6 @@ following hold::
np.bool_(True) + 1 == np.int64(2)
True + np.uint8(2) == np.uint8(3)

.. _nep50_comparison_table::

Note that while this NEP uses simple operators as example, the rules described
generally apply to all of NumPy operations.

Expand Down
2 changes: 1 addition & 1 deletion doc/neps/nep-0052-python-api-cleanup.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ NumPy has a large API surface that evolved organically over many years:
>>> len(modules)
14

The above doesn't even include items that are public but have been
The above doesn't even include items that are public but have
been hidden from ``__dir__``.
A particularly problematic example of that is ``np.core``,
which is technically private but heavily used in practice.
Expand Down
2 changes: 1 addition & 1 deletion doc/neps/nep-0054-simd-cpp-highway.rst
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ merged clang-cl support a while back (see `gh-20866`_), and SciPy builds with
Mingw-w64. It may however impact other redistributors or end users who build
from source on Windows.

In response to the earlier dicussions around this NEP, Highway is now
In response to the earlier discussions around this NEP, Highway is now
dual-licensed as Apache 2 / BSD-3.


Expand Down
13 changes: 0 additions & 13 deletions doc/release/upcoming_changes/19355.new_feature.rst

This file was deleted.

Loading
You are viewing a condensed version of this merge commit. You can view the full changes here.