diff --git a/.circleci/config.yml b/.circleci/config.yml index 772c3fbfda54..c6b9a6c3ea28 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,115 +1,177 @@ -# Python CircleCI 2.0 configuration file +# Python CircleCI 2.1 configuration file # -# Check https://circleci.com/docs/2.0/language-python/ for more details +# Check https://circleci.com/docs/2.1/language-python/ for more details # -version: 2 -jobs: - build: - docker: - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - - image: circleci/python:3.6.6 +version: 2.1 - working_directory: ~/repo +# Aliases to reuse +_defaults: &defaults + docker: + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.1/circleci-images/ + # circleci/python3.8 images come with old versions of Doxygen(1.6.x), + # therefore a new base image chose instead to guarantee to + # have a newer version >= 1.8.10 to avoid warnings + # that related to the default behaviors or non-exist config options + - image: cimg/python:3.9 + working_directory: ~/repo + +jobs: + build: + <<: *defaults steps: - checkout - run: - name: install dependencies + name: Check-skip + command: | + export git_log=$(git log --max-count=1 --pretty=format:"%B" | tr "\n" " ") + echo "Got commit message:" + echo "${git_log}" + if [[ -v CIRCLE_PULL_REQUEST ]] && \ + ([[ "$git_log" == *"[skip circle]"* ]] || \ + [[ "$git_log" == *"[circle skip]"* ]]) + then + echo "Skip detected, exiting job ${CIRCLE_JOB} for PR ${CIRCLE_PULL_REQUEST}." + circleci-agent step halt; + fi + - run: + name: pull changes from merge + command: | + if [[ -v CI_PULL_REQUEST ]] ; then git pull --ff-only origin "refs/pull/${CI_PULL_REQUEST//*pull\//}/merge" ; fi + + - run: + name: update submodules + command: | + git submodule init + git submodule update + + - run: + name: create virtual environment, install dependencies command: | - python3 -m venv venv - ln -s $(which python3) venv/bin/python3.6 - . venv/bin/activate - pip install cython sphinx==2.2.0 matplotlib ipython sudo apt-get update - sudo apt-get install -y graphviz texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra texlive-generic-extra latexmk texlive-xetex + #sudo apt-get install -y python3.9 python3.9-dev python3-venv graphviz texlive-fonts-recommended texlive-latex-recommended \ + sudo apt-get install -y graphviz texlive-fonts-recommended texlive-latex-recommended \ + texlive-latex-extra latexmk texlive-xetex texlive-lang-chinese doxygen + python3.9 -m venv venv + . venv/bin/activate - run: name: build numpy command: | . venv/bin/activate - pip install --upgrade pip setuptools - pip install cython - pip install . - pip install scipy + pip install --progress-bar=off -r test_requirements.txt + pip install --progress-bar=off -r doc_requirements.txt + pip install . --config-settings=setup-args="-Dallow-noblas=true" - run: name: create release notes command: | . venv/bin/activate - pip install git+https://github.com/hawkowl/towncrier.git@master VERSION=$(python -c "import setup; print(setup.VERSION)") - towncrier --version $VERSION --yes + towncrier build --version $VERSION --yes ./tools/ci/test_all_newsfragments_used.py + + - run: + name: run doctests on documentation + command: | + . venv/bin/activate + (cd doc ; git submodule update --init) + python tools/refguide_check.py --rst + - run: - name: build devdocs + name: build devdocs w/ref warnings command: | . venv/bin/activate cd doc - git submodule update --init - SPHINXOPTS=-q make -e html + # Don't use -q, show warning summary" + SPHINXOPTS="-j2 -n" make -e html || echo "ignoring errors for now, see gh-13114" + if [[ $(find build/html -type f | wc -l) -lt 1000 ]]; then + echo "doc build failed: build/html is empty" + exit -1 + fi - run: name: build neps command: | . venv/bin/activate cd doc/neps - SPHINXOPTS=-q make -e html + SPHINXOPTS="-j2 -q" make -e html - store_artifacts: path: doc/build/html/ - - # - store_artifacts: - # path: doc/neps/_build/html/ + - store_artifacts: + path: doc/neps/_build/html/ # destination: neps + - persist_to_workspace: + root: ~/repo + paths: + - doc/build/html + - doc/neps/_build + - tools/ci/push_docs_to_repo.py + + deploy: + <<: *defaults + steps: + - checkout + + - attach_workspace: + at: ~/repo + - add_ssh_keys: fingerprints: - - "9f:8c:e5:3f:53:40:0b:ee:c9:c3:0f:fd:0f:3c:cc:55" + - "45:d8:d1:d6:f7:53:47:c5:d0:9e:35:19:79:e7:ff:24" - run: name: deploy devdocs command: | - if [ "${CIRCLE_BRANCH}" == "master" ]; then - touch doc/build/html/.nojekyll - - ./tools/ci/push_docs_to_repo.py doc/build/html \ - git@github.com:numpy/devdocs.git \ - --committer "numpy-circleci-bot" \ - --email "numpy-circleci-bot@nomail" \ - --message "Docs build of $CIRCLE_SHA1" \ - --force - else - echo "Not on the master branch; skipping deployment" - fi + touch doc/build/html/.nojekyll + + ./tools/ci/push_docs_to_repo.py doc/build/html \ + --committer "numpy-circleci-bot" \ + --email "numpy-circleci-bot@nomail" \ + --message "Docs build of $CIRCLE_SHA1" \ + --count 5 \ + --force \ + git@github.com:numpy/devdocs.git - add_ssh_keys: fingerprints: - - "11:fb:19:69:80:3a:6d:37:9c:d1:ac:20:17:cd:c8:17" + - "df:8b:fb:34:2d:38:7d:49:fc:1b:e8:44:4f:bd:2c:0e" - run: name: select SSH key for neps repo command: | - cat <<\EOF > ~/.ssh/config + cat \<<\EOF > ~/.ssh/config Host github.com IdentitiesOnly yes - IdentityFile /home/circleci/.ssh/id_rsa_11fb1969803a6d379cd1ac2017cdc817 + IdentityFile /home/circleci/.ssh/id_rsa_df8bfb342d387d49fc1be8444fbd2c0e EOF - run: name: deploy neps command: | - if [ "${CIRCLE_BRANCH}" == "master" ]; then - touch doc/neps/_build/html/.nojekyll - - ./tools/ci/push_docs_to_repo.py doc/neps/_build/html \ - git@github.com:numpy/neps.git \ - --committer "numpy-circleci-bot" \ - --email "numpy-circleci-bot@nomail" \ - --message "Docs build of $CIRCLE_SHA1" \ - --force - else - echo "Not on the master branch; skipping deployment" - fi + touch doc/neps/_build/html/.nojekyll + + ./tools/ci/push_docs_to_repo.py doc/neps/_build/html \ + --committer "numpy-circleci-bot" \ + --email "numpy-circleci-bot@nomail" \ + --message "Docs build of $CIRCLE_SHA1" \ + --count 5 \ + --force \ + git@github.com:numpy/neps.git \ + +workflows: + version: 2 + default: + jobs: + - build + - deploy: + requires: + - build + filters: + branches: + only: main diff --git a/.cirrus.star b/.cirrus.star new file mode 100644 index 000000000000..c503f25720a7 --- /dev/null +++ b/.cirrus.star @@ -0,0 +1,54 @@ +# The guide to programming cirrus-ci tasks using starlark is found at +# https://cirrus-ci.org/guide/programming-tasks/ +# +# In this simple starlark script we simply check conditions for whether +# a CI run should go ahead. If the conditions are met, then we just +# return the yaml containing the tasks to be run. + +load("cirrus", "env", "fs", "http") + +def main(ctx): + ###################################################################### + # Should wheels be built? + # Only test on the numpy/numpy repository + ###################################################################### + + if env.get("CIRRUS_REPO_FULL_NAME") != "numpy/numpy": + return [] + + # only run the wheels entry on a cron job + if env.get("CIRRUS_CRON", "") == "nightly": + return fs.read("tools/ci/cirrus_wheels.yml") + + # Obtain commit message for the event. Unfortunately CIRRUS_CHANGE_MESSAGE + # only contains the actual commit message on a non-PR trigger event. + # For a PR event it contains the PR title and description. + SHA = env.get("CIRRUS_CHANGE_IN_REPO") + url = "https://api.github.com/repos/numpy/numpy/git/commits/" + SHA + dct = http.get(url).json() + + commit_msg = dct["message"] + if "[skip cirrus]" in commit_msg or "[skip ci]" in commit_msg: + return [] + + wheel = False + labels = env.get("CIRRUS_PR_LABELS", "") + pr_number = env.get("CIRRUS_PR", "-1") + tag = env.get("CIRRUS_TAG", "") + + if "[wheel build]" in commit_msg: + wheel = True + + # if int(pr_number) > 0 and ("14 - Release" in labels or "36 - Build" in labels): + # wheel = True + + if tag.startswith("v") and "dev0" not in tag: + wheel = True + + if wheel: + return fs.read("tools/ci/cirrus_wheels.yml") + + if int(pr_number) < 0: + return [] + + return fs.read("tools/ci/cirrus_arm.yml") diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000000..60b1066bcff7 --- /dev/null +++ b/.clang-format @@ -0,0 +1,37 @@ +# A clang-format style that approximates Python's PEP 7 +# Useful for IDE integration +# +# Based on Paul Ganssle's version at +# https://gist.github.com/pganssle/0e3a5f828b4d07d79447f6ced8e7e4db +# and modified for NumPy +BasedOnStyle: Google +AlignAfterOpenBracket: Align +AllowShortEnumsOnASingleLine: false +AllowShortIfStatementsOnASingleLine: false +AlwaysBreakAfterReturnType: TopLevel +BreakBeforeBraces: Stroustrup +ColumnLimit: 79 +ContinuationIndentWidth: 8 +DerivePointerAlignment: false +IndentWidth: 4 +IncludeBlocks: Regroup +IncludeCategories: + - Regex: '^[<"](Python|structmember|pymem)\.h' + Priority: -3 + CaseSensitive: true + - Regex: '^"numpy/' + Priority: -2 + - Regex: '^"(npy_pycompat|npy_config)' + Priority: -1 + - Regex: '^"[[:alnum:]_.]+"' + Priority: 1 + - Regex: '^<[[:alnum:]_.]+"' + Priority: 2 +Language: Cpp +PointerAlignment: Right +ReflowComments: true +SpaceBeforeParens: ControlStatements +SpacesInParentheses: false +StatementMacros: [PyObject_HEAD, PyObject_VAR_HEAD, PyObject_HEAD_EXTRA] +TabWidth: 4 +UseTab: Never diff --git a/.codecov.yml b/.codecov.yml index d92d54c9d806..165b3099df18 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -6,8 +6,9 @@ coverage: status: project: default: - # Require 1% coverage, i.e., always succeed - target: 1 - patch: false + informational: true + patch: + default: + informational: true changes: false comment: off diff --git a/.dependabot/config.yml b/.dependabot/config.yml deleted file mode 100644 index 160ec85cfa7f..000000000000 --- a/.dependabot/config.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: 1 -update_configs: - - package_manager: "python" - directory: "/" - update_schedule: "weekly" - commit_message: - prefix: "MAINT" - default_labels: - - "03 - Maintenance" diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000000..a31be7931370 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,17 @@ +{ + // More info about Features: https://containers.dev/features + "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": {}, + + "onCreateCommand": ".devcontainer/setup.sh", + "postCreateCommand": "", + + "customizations": { + "vscode": { + "extensions": [ + "ms-python.python" + ], + "settings": {} + } + } +} diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 000000000000..1f3005d30d2f --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +"${SHELL}" <(curl -Ls micro.mamba.pm/install.sh) < /dev/null + +conda init --all +micromamba shell init -s bash +micromamba env create -f environment.yml --yes +# Note that `micromamba activate numpy-dev` doesn't work, it must be run by the +# user (same applies to `conda activate`) + +git submodule update --init + +# Enables users to activate environment without having to specify the full path +echo "envs_dirs: + - /home/codespace/micromamba/envs" > /opt/conda/.condarc diff --git a/.gitattributes b/.gitattributes index dad6dde37cd0..9282851b8014 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,113 @@ -# Numerical data files -numpy/lib/tests/data/*.npy binary +# Highlight our custom templating language as C, since it's hopefully better +# than nothing. This also affects repo statistics. +*.c.src text linguist-language=C +*.inc.src text linguist-language=C +*.h.src text linguist-language=C +*.pyx.in text linguist-language=Python +*.pxd.in text linguist-language=Python + +# Mark some files as vendored +numpy/linalg/lapack_lite/f2c.c linguist-vendored +numpy/linalg/lapack_lite/f2c.h linguist-vendored +tools/npy_tempita/* linguist-vendored +numpy/core/include/numpy/libdivide/* linguist-vendored +numpy/core/src/umath/svml/* linguist-vendored +numpy/core/src/common/dlpack/dlpack.h linguist-vendored + +# Mark some files as generated +numpy/linalg/lapack_lite/f2c_*.c linguist-generated +numpy/linalg/lapack_lite/lapack_lite_names.h linguist-generated + +# version generated from pyproject.toml during build +numpy/version.py linguist-generated + +# Configuration files +*.ini text +*.cfg text +./MANIFEST.in text +./numpy/core/npymath.ini.in text +./numpy/core/mlib.ini.in text +./site.cfg.example text + +# Python sources +*.py text diff=python +*.pxd text diff=python +*.pyx text diff=python +*.pyi text diff=python + +# C/C++ sources +*.c text diff=c +*.h text diff=c +*.cc text diff=cpp +*.cxx text diff=cpp +*.cpp text diff=cpp +*.hpp text diff=cpp +*.hh text diff=cpp + +# Fortran sources +*.f text diff=fortran +*.for text diff=fortran +*.f90 text diff=fortran +*.f95 text diff=fortran +*.f03 text diff=fortran + +# JavaScript +*.js text + +# 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 +*.txt text +*.rst text +*.pdf binary +*.css text diff=css +*.html text diff=html + +# Graphics +*.png binary +*.ico binary +*.dia binary +*.gif binary +*.odg binary +*.fig text +*.svg text +# SVG is treated as an asset (binary) by default. If you want +# to treat it as binary, use the following line instead. +# *.svg binary + +# Scripts +*.sh text eol=lf +*.sed text +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf + +# Serialisation +*.json text +*.toml text +*.xml text +*.yaml text +*.yml text + +# Data files +*.csv text +*.pkl binary +*.fits binary +*.npy binary +*.npz binary + +# Misc. +*.swg text +*.patch text +./doc/neps/index.rst.tmpl text +./benchmarks/asv_compare.conf.json.tpl text +./tools/swig/test/*.i text +./tools/gitpod/gitpod.Dockerfile text +./doc/source/dev/gitwash/git_links.inc text +./doc/source/reference/simd/*.inc text +./numpy/core/src/_simd/*.inc text diff=c -# Release notes, reduce number of conflicts. -doc/release/*.rst merge=union diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md deleted file mode 100644 index 57c98060eb3b..000000000000 --- a/.github/CODE_OF_CONDUCT.md +++ /dev/null @@ -1 +0,0 @@ -NumPy has a Code of Conduct, please see: https://www.numpy.org/devdocs/dev/conduct/code_of_conduct.html diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 22113b913946..8f16950f765e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,7 +8,7 @@ also include a brief, self-contained code example that demonstrates the problem. If you are reporting a segfault please include a GDB traceback, which you can generate by following -[these instructions.](https://github.com/numpy/numpy/blob/master/doc/source/dev/development_environment.rst#debugging) +[these instructions.](https://github.com/numpy/numpy/blob/main/doc/source/dev/development_environment.rst#debugging) ## Contributing code @@ -29,3 +29,12 @@ If you are writing new C code, please follow the style described in Suggested ways to work on your development version (compile and run the tests without interfering with system packages) are described in ``doc/source/dev/development_environment.rst``. + +### A note on feature enhancements/API changes + +If you are interested in adding a new feature to NumPy, consider +submitting your feature proposal to the [mailing list][mail], +which is the preferred forum for discussing new features and +API changes. + +[mail]: https://mail.python.org/mailman/listinfo/numpy-discussion diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 25322bd343b0..000000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -github: [numfocus] -tidelift: pypi/numpy -custom: https://www.numpy.org/#support-numpy diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 3a25eeb1e9a3..000000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,27 +0,0 @@ - - - -### Reproducing code example: - - - -```python -import numpy as np -<< your code here >> -``` - - - -### Error message: - - - - - -### Numpy/Python version information: - - - diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 000000000000..a15a3a144aad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,63 @@ +name: Bug report +description: Report a bug. For security vulnerabilities see Report a security vulnerability in the templates. +title: "BUG: " +labels: [00 - Bug] + +body: +- type: markdown + attributes: + value: > + Thank you for taking the time to file a bug report. Before creating a new + issue, please make sure to take a few minutes to check the issue tracker + for existing issues about the bug. + +- type: textarea + attributes: + label: "Describe the issue:" + validations: + required: true + +- type: textarea + attributes: + label: "Reproduce the code example:" + description: > + A short code example that reproduces the problem/missing feature. It + should be self-contained, i.e., can be copy-pasted into the Python + interpreter or run as-is via `python myproblem.py`. + placeholder: | + import numpy as np + << your code here >> + render: python + validations: + required: true + +- type: textarea + attributes: + label: "Error message:" + description: > + Please include full error message, if any. + If you are reporting a segfault please include a GDB traceback, + which you can generate by following + [these instructions](https://github.com/numpy/numpy/blob/main/doc/source/dev/development_environment.rst#debugging). + placeholder: | + << Full traceback starting from `Traceback: ...` >> + render: shell + +- type: textarea + attributes: + label: "Runtime information:" + description: > + Output from `import sys, numpy; print(numpy.__version__); print(sys.version)` + If you are running NumPy 1.24+, also show `print(numpy.show_runtime())` + validations: + required: true + +- type: textarea + attributes: + label: "Context for the issue:" + description: | + Please explain how this issue affects your work or why it should be prioritized. + placeholder: | + << your explanation here >> + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000000..adfff81bd004 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,7 @@ +contact_links: + - name: Question/Help/Support + url: https://numpy.org/gethelp/ + about: "If you have a question, please look at the listed resources available on the website." + - name: Development-related matters + url: https://numpy.org/community/ + about: "If you would like to discuss development-related matters or need help from the NumPy team, see our community's communication channels." diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml new file mode 100644 index 000000000000..afff9ab5f1cd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.yml @@ -0,0 +1,23 @@ +name: Documentation +description: Report an issue related to the NumPy documentation. +title: "DOC: " +labels: [04 - Documentation] + +body: +- type: textarea + attributes: + label: "Issue with current documentation:" + description: > + Please make sure to leave a reference to the document/code you're + referring to. You can also check the development version of the + documentation and see if this issue has already been addressed at + https://numpy.org/devdocs. + +- type: textarea + attributes: + label: "Idea or request for content:" + description: > + Please describe as clearly as possible what topics you think are missing + from the current documentation. Make sure to check + https://github.com/numpy/numpy-tutorials and see if this issue might be + more appropriate there. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 000000000000..390c3d53bba2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,22 @@ +name: Feature request +description: Check instructions for submitting your idea on the mailing list first. +title: "ENH: " + +body: +- type: markdown + attributes: + value: > + If you're looking to request a new feature or change in functionality, + including adding or changing the meaning of arguments to an existing + function, please post your idea on the + [numpy-discussion mailing list](https://mail.python.org/mailman/listinfo/numpy-discussion) + to explain your reasoning in addition to opening an issue or pull request. + You can also check out our + [Contributor Guide](https://github.com/numpy/numpy/blob/main/doc/source/dev/index.rst) + if you need more information. + +- type: textarea + attributes: + label: "Proposed new feature or change:" + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/post-install.yml b/.github/ISSUE_TEMPLATE/post-install.yml new file mode 100644 index 000000000000..a5fa07be0279 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/post-install.yml @@ -0,0 +1,31 @@ +name: Post-install/importing issue +description: Report an issue if you have trouble importing or using NumPy after installation. +title: "" +labels: [32 - Installation] + +body: +- type: textarea + attributes: + label: "Steps to reproduce:" + description: > + Please describe the installation method (e.g. building from source, + Anaconda, pip), your OS and NumPy/Python version information. + validations: + required: true + +- type: textarea + attributes: + label: "Error message:" + description: > + Please include full error message, if any. + If you are reporting a segfault please include a GDB traceback, + which you can generate by following + [these instructions](https://github.com/numpy/numpy/blob/main/doc/source/dev/development_environment.rst#debugging). + placeholder: | + << Full traceback starting from `Traceback: ...` >> + render: shell + +- type: textarea + attributes: + label: "Additional information:" + description: Please add any additional information that could help us diagnose the problem better. \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e12eea7bd763..3cb690fa494c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,7 +1,16 @@ - + diff --git a/.github/actions/action.yml b/.github/actions/action.yml new file mode 100644 index 000000000000..2c271c0c5726 --- /dev/null +++ b/.github/actions/action.yml @@ -0,0 +1,26 @@ +name: DoTheWork +description: "checkout repo, build and run tests" +runs: + using: composite + steps: + - name: Show env + shell: bash + run: | + echo NPY_RELAXED_STRIDES_DEBUG $NPY_RELAXED_STRIDES_DEBUG + echo CHECK_BLAS $CHECK_BLAS + echo DOWNLOAD_OPENBLAS $DOWNLOAD_OPENBLAS + echo USE_DEBUG $USE_DEBUG + echo NPY_USE_BLAS_ILP64 $NPY_USE_BLAS_ILP64 + echo USE_ASV $USE_ASV + echo PATH $PATH + echo python `which python` + python -c "import sys; print(sys.version)" + + - name: BeforeInstall + shell: bash + run: ./tools/travis-before-install.sh + + - name: Test + shell: bash + run: ./tools/travis-test.sh + diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..b59fe181d119 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: daily + commit-message: + prefix: "MAINT" + labels: + - "03 - Maintenance" diff --git a/.github/meson_actions/action.yml b/.github/meson_actions/action.yml new file mode 100644 index 000000000000..fb3042c0ade2 --- /dev/null +++ b/.github/meson_actions/action.yml @@ -0,0 +1,37 @@ +name: MesonBuildTest +description: "checkout repo, build, and test numpy" +runs: + using: composite + steps: + - name: Build + shell: 'script -q -e -c "bash --noprofile --norc -eo pipefail {0}"' + env: + TERM: xterm-256color + PKG_CONFIG_PATH: ./.openblas + run: | + echo "::group::Installing Build Dependencies" + pip install -r build_requirements.txt + echo "::endgroup::" + echo "::group::Building NumPy" + spin build --clean -- ${MESON_ARGS[@]} + echo "::endgroup::" + + - name: Meson Log + shell: bash + if: always() + run: | + echo "::group::Meson Log" + cat build/meson-logs/meson-log.txt + echo "::endgroup::" + + - name: Test + shell: 'script -q -e -c "bash --noprofile --norc -eo pipefail {0}"' + env: + TERM: xterm-256color + run: | + echo "::group::Installing Test Dependencies" + pip install pytest pytest-xdist hypothesis typing_extensions setuptools + echo "::endgroup::" + echo "::group::Test NumPy" + spin test + echo "::endgroup::" diff --git a/.github/pr-prefix-labeler.yml b/.github/pr-prefix-labeler.yml new file mode 100644 index 000000000000..2b95f1f314f6 --- /dev/null +++ b/.github/pr-prefix-labeler.yml @@ -0,0 +1,15 @@ +"API": "30 - API" +"BENCH": "28 - Benchmark" +"BUG": "00 - Bug" +"BLD": "36 - Build" +"DEP": "07 - Deprecation" +"DEV": "16 - Development" +"DOC": "04 - Documentation" +"ENH": "01 - Enhancement" +"MAINT": "03 - Maintenance" +"REV": "34 - Reversion" +"STY": "03 - Maintenance" +"TST": "05 - Testing" +"REL": "14 - Release" +"WIP": "25 - WIP" +"TYP": "static typing" diff --git a/.github/workflows/circleci.yml b/.github/workflows/circleci.yml new file mode 100644 index 000000000000..c3d1c0ccf1b0 --- /dev/null +++ b/.github/workflows/circleci.yml @@ -0,0 +1,25 @@ +# To enable this workflow on a fork, comment out: +# +# if: github.repository == 'numpy/numpy' + +name: CircleCI artifact redirector + +on: [status] + +permissions: read-all + +jobs: + circleci_artifacts_redirector_job: + runs-on: ubuntu-latest + if: "github.repository == 'numpy/numpy' && !contains(github.event.head_commit.message, '[circle skip]') && !contains(github.event.head_commit.message, '[skip circle]') && github.event.context == 'ci/circleci: build'" + name: Run CircleCI artifacts redirector + permissions: + statuses: write + steps: + - name: GitHub Action step + uses: larsoner/circleci-artifacts-redirector-action@7e80b26b4c58b5d3272effc05491c18296b1ad6e # master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + api-token: ${{ secrets.CIRCLE_TOKEN }} + artifact-path: 0/doc/build/html/index.html + circleci-jobs: build diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000000..08bcf63fdb75 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,73 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: ["main"] + pull_request: + # The branches below must be a subset of the branches above + branches: ["main"] + schedule: + - cron: "0 0 * * 1" + +permissions: + contents: read + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ["python"] + # CodeQL supports [ $supported-codeql-languages ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@cdcdbb579706841c47f7063dda365e292e5cad7a # v2.13.4 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@cdcdbb579706841c47f7063dda365e292e5cad7a # v2.13.4 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@cdcdbb579706841c47f7063dda365e292e5cad7a # v2.13.4 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/cygwin.yml b/.github/workflows/cygwin.yml new file mode 100644 index 000000000000..55a0bc50a628 --- /dev/null +++ b/.github/workflows/cygwin.yml @@ -0,0 +1,84 @@ +# To enable this workflow on a fork, comment out: +# +# if: github.repository == 'numpy/numpy' +name: Test on Cygwin +on: + pull_request: + branches: + - main + - maintenance/** + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + cygwin_build_test: + runs-on: windows-latest + if: "github.repository == 'numpy/numpy'" + steps: + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + submodules: recursive + fetch-depth: 0 + - name: Install Cygwin + uses: cygwin/cygwin-install-action@006ad0b0946ca6d0a3ea2d4437677fa767392401 # v4 + with: + platform: x86_64 + install-dir: 'C:\tools\cygwin' + packages: >- + python39-devel python39-zipp python39-importlib-metadata + python39-cython python39-pip python39-wheel python39-cffi + python39-pytz python39-setuptools python39-pytest + python39-hypothesis liblapack-devel + gcc-fortran gcc-g++ git dash + - name: Set Windows PATH + uses: egor-tensin/cleanup-path@8469525c8ee3eddabbd3487658621a6235b3c581 # v3 + with: + dirs: 'C:\tools\cygwin\bin;C:\tools\cygwin\lib\lapack' + - name: Verify that bash is Cygwin bash + run: | + command bash + bash -c "uname -svrmo" + - name: Tell Cygwin's git about this repository. + run: | + dash -c "which git; /usr/bin/git config --system --add safe.directory /cygdrive/d/a/numpy/numpy" + - name: Verify python version + # Make sure it's the Cygwin one, not a Windows one + run: | + dash -c "which python3.9; /usr/bin/python3.9 --version -V" + - name: Build NumPy wheel + run: | + dash -c "/usr/bin/python3.9 -m pip install 'setuptools<49.2.0' pytest pytz cffi pickle5 importlib_metadata typing_extensions" + dash -c "/usr/bin/python3.9 -m pip install -r test_requirements.txt" + dash -c "/usr/bin/python3.9 setup.py bdist_wheel" + - name: Install new NumPy + run: | + bash -c "/usr/bin/python3.9 -m pip install dist/numpy-*cp39*.whl" + - name: Rebase NumPy compiled extensions + run: | + dash "tools/rebase_installed_dlls_cygwin.sh" 3.9 + - name: Run NumPy test suite + shell: "C:\\tools\\cygwin\\bin\\bash.exe -o igncr -eo pipefail {0}" + run: | + /usr/bin/python3.9 runtests.py -n + - name: Upload wheel if tests fail + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + if: failure() + with: + name: numpy-cygwin-wheel + path: dist/numpy-*cp39*.whl + - name: Check the extension modules on failure + if: failure() + run: | + dash -c "/usr/bin/python3.9 -m pip show numpy" + dash -c "/usr/bin/python3.9 -m pip show -f numpy | grep .dll" + dash -c "/bin/tr -d '\r' list_dlls_unix.sh" + dash "list_dlls_unix.sh" 3.9 + - name: Print installed package versions on failure + if: failure() + run: | + cygcheck -c diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 000000000000..07127a7f6cb5 --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,20 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout Repository' + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + - name: 'Dependency Review' + uses: actions/dependency-review-action@1360a344ccb0ab6e9475edef90ad2f46bf8003b1 # v3.0.6 diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml new file mode 100644 index 000000000000..8e23c1bc4836 --- /dev/null +++ b/.github/workflows/emscripten.yml @@ -0,0 +1,80 @@ +# To enable this workflow on a fork, comment out: +# +# if: github.repository == 'numpy/numpy' +name: Test Emscripten/Pyodide build + +on: + pull_request: + branches: + - main + - maintenance/** + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + build-wasm-emscripten: + runs-on: ubuntu-22.04 + if: "github.repository == 'numpy/numpy'" + env: + PYODIDE_VERSION: 0.23.1 + # PYTHON_VERSION and EMSCRIPTEN_VERSION are determined by PYODIDE_VERSION. + # The appropriate versions can be found in the Pyodide repodata.json + # "info" field, or in Makefile.envs: + # https://github.com/pyodide/pyodide/blob/main/Makefile.envs#L2 + PYTHON_VERSION: 3.11.2 + EMSCRIPTEN_VERSION: 3.1.32 + NODE_VERSION: 18 + steps: + - name: Checkout numpy + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + submodules: true + # versioneer.py requires the latest tag to be reachable. Here we + # fetch the complete history to get access to the tags. + # A shallow clone can work when the following issue is resolved: + # https://github.com/actions/checkout/issues/338 + fetch-depth: 0 + + - name: set up python + id: setup-python + uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - uses: mymindstorm/setup-emsdk@ab889da2abbcbb280f91ec4c215d3bb4f3a8f775 # v12 + with: + version: ${{ env.EMSCRIPTEN_VERSION }} + actions-cache-folder: emsdk-cache + + - name: Install pyodide-build + run: pip install "pydantic<2" pyodide-build==$PYODIDE_VERSION + + - name: Build + run: | + # Pyodide is still in the process of adding better/easier support for + # non-setup.py based builds. + cp pyproject.toml.setuppy pyproject.toml + CFLAGS=-g2 LDFLAGS=-g2 pyodide build + + - name: set up node + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3.7.0 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Set up Pyodide virtual environment + run: | + pyodide venv .venv-pyodide + source .venv-pyodide/bin/activate + pip install dist/*.whl + python -c "import sys; print(sys.platform)" + pip install -r test_requirements.txt + - name: Test + run: | + source .venv-pyodide/bin/activate + cd .. + python numpy/runtests.py -n -vv diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 000000000000..9ceafebb711a --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,19 @@ +name: "Pull Request Labeler" +on: + pull_request_target: + types: [opened] + +permissions: {} + +jobs: + pr-labeler: + runs-on: ubuntu-latest + permissions: + pull-requests: write # to add labels + steps: + - name: Label the PR + uses: gerrymanoim/pr-prefix-labeler@c8062327f6de59a9ae1c19f7f07cacd0b976b6fa # v3 + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + if: github.repository == 'numpy/numpy' diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 000000000000..ebceec365d7c --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,239 @@ +name: Linux tests + +# This file is meant for testing across supported Python versions, build types +# and interpreters (PyPy, python-dbg, a pre-release Python in summer time), +# build-via-sdist, run benchmarks, measure code coverage, and other build +# options like relaxed-strides. + +on: + push: + branches: + # coverage comparison in the "full" step needs to run on main after merges + - main + pull_request: + branches: + - main + - maintenance/** + +defaults: + run: + shell: bash + +env: + DOWNLOAD_OPENBLAS: 1 + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + lint: + if: github.repository == 'numpy/numpy' && github.event_name != 'push' + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.9' + - name: Install linter requirements + run: + python -m pip install -r linter_requirements.txt + - name: Run linter on PR diff + run: + python tools/linter.py --branch origin/${{ github.base_ref }} + + smoke_test: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + env: + MESON_ARGS: "-Dallow-noblas=true -Dcpu-baseline=none -Dcpu-dispatch=none" + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.9' + - uses: ./.github/meson_actions + + basic: + needs: [smoke_test] + runs-on: ubuntu-latest + if: github.event_name != 'push' + strategy: + matrix: + python-version: ["3.9", "pypy3.9-v7.3.12"] + env: + EXPECT_CPU_FEATURES: "SSE SSE2 SSE3 SSSE3 SSE41 POPCNT SSE42 AVX F16C FMA3 AVX2 AVX512F AVX512CD AVX512_KNL AVX512_KNM AVX512_SKX AVX512_CLX AVX512_CNL AVX512_ICL" + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: ${{ matrix.python-version }} + - uses: ./.github/actions + + debug: + needs: [smoke_test] + runs-on: ubuntu-latest + if: github.event_name != 'push' + env: + USE_DEBUG: 1 + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.11' + + - uses: ./.github/actions + + full: + # Build a wheel, install it, then run the full test suite with code coverage + needs: [smoke_test] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.9' + - name: Install build and test dependencies from PyPI + run: | + pip install -r build_requirements.txt + pip install -r test_requirements.txt + - name: Install gfortran and OpenBLAS (MacPython build) + run: | + set -xe + sudo apt install gfortran libgfortran5 + target=$(python tools/openblas_support.py) + sudo cp -r $target/lib/* /usr/lib + sudo cp $target/include/* /usr/include + - name: Build a wheel + run: | + python -m build --wheel --no-isolation --skip-dependency-check + pip install dist/numpy*.whl + - name: Run full test suite + run: | + cd tools + pytest --pyargs numpy --cov-report=html:build/coverage + # TODO: gcov + + benchmark: + needs: [smoke_test] + runs-on: ubuntu-latest + if: github.event_name != 'push' + env: + PYTHONOPTIMIZE: 2 + BLAS: None + LAPACK: None + ATLAS: None + NPY_BLAS_ORDER: mkl,blis,openblas,atlas,blas + NPY_LAPACK_ORDER: MKL,OPENBLAS,ATLAS,LAPACK + USE_ASV: 1 + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.9' + - uses: ./.github/actions + + relaxed_strides_debug: + needs: [smoke_test] + runs-on: ubuntu-latest + if: github.event_name != 'push' + env: + CHECK_BLAS: 1 + NPY_USE_BLAS_ILP64: 1 + NPY_RELAXED_STRIDES_DEBUG: 1 + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.11' + - uses: ./.github/actions + + sdist: + needs: [smoke_test] + runs-on: ubuntu-latest + if: github.event_name != 'push' + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.11' + - name: Install gfortran and OpenBLAS (MacPython build) + run: | + set -xe + sudo apt install gfortran libgfortran5 + target=$(python tools/openblas_support.py) + sudo cp -r $target/lib/* /usr/lib + sudo cp $target/include/* /usr/include + - name: Build a wheel via an sdist + run: | + pip install build + python -m build + pip install dist/numpy*.whl + - name: Install test dependencies + run: | + pip install -r test_requirements.txt + pip install ninja + - name: Run test suite + run: | + cd tools + pytest --pyargs numpy -m "not slow" + + custom_checks: + needs: [smoke_test] + runs-on: ubuntu-latest + if: github.event_name != 'push' + steps: + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.11' + - name: Install build and test dependencies from PyPI + run: | + pip install -r build_requirements.txt + pip install -r test_requirements.txt + pip install vulture + - name: Build and install NumPy + run: | + # Install using the fastests way to build (no BLAS, no SIMD) + spin build -j2 -- -Dallow-noblas=true -Dcpu-baseline=none -Dcpu-dispatch=none + - name: Check build-internal dependencies + run: | + ninja -C build -t missingdeps + - name: Check installed test and stub files + run: | + python tools/check_installed_files.py $(find ./build-install -path '*/site-packages/numpy') + - name: Check for unreachable code paths in Python modules + run: | + # Need the explicit `bash -c` here because `grep` returns exit code 1 for no matches + bash -c "! vulture . --min-confidence 100 --exclude doc/,numpy/distutils/,vendored-meson/ | grep 'unreachable'" diff --git a/.github/workflows/linux_blas.yml b/.github/workflows/linux_blas.yml new file mode 100644 index 000000000000..aac37d205e9d --- /dev/null +++ b/.github/workflows/linux_blas.yml @@ -0,0 +1,395 @@ +name: BLAS tests (Linux) + +# This file is meant for testing different BLAS/LAPACK flavors and build +# options on Linux. All other yml files for Linux will only test without BLAS +# (mostly because that's easier and faster to build) or with the same 64-bit +# OpenBLAS build that is used in the wheel jobs. +# +# Jobs and their purpose: +# +# - openblas64_setuppy: +# This job uses the default 64-bit build of OpenBLAS with the +# `numpy.distutils`-based build. It can be removed once we remove +# support for those builds. +# - openblas32_stable_nightly: +# Uses the 32-bit OpenBLAS builds, both the latest stable release +# and a nightly build. +# - openblas_no_pkgconfig_fedora: +# Test OpenBLAS on Fedora. Fedora doesn't ship .pc files for OpenBLAS, +# hence this exercises the "system dependency" detection method. +# - flexiblas_fedora: +# Tests FlexiBLAS (the default on Fedora for its own packages), via +# pkg-config. FlexiBLAS allows runtime switching of BLAS/LAPACK +# libraries, which is a useful capability (not tested in this job). +# - openblas_cmake: +# Tests whether OpenBLAS LP64 is detected correctly when only CMake +# and not pkg-config is installed. +# - netlib-debian: +# Installs libblas/liblapack, which in Debian contains libcblas within +# libblas. +# - netlib-split: +# Installs vanilla Netlib blas/lapack with separate libcblas, which is +# the last option tried in auto-detection. +# - mkl: +# Tests MKL installed from PyPI (because easiest/fastest, if broken) in +# 3 ways: both LP64 and ILP64 via pkg-config, and then using the +# Single Dynamic Library (SDL, or `libmkl_rt`). +# - blis: +# Simple test for LP64 via pkg-config +# - atlas: +# Simple test for LP64 via pkg-config + +on: + pull_request: + branches: + - main + - maintenance/** + +defaults: + run: + shell: bash + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + openblas32_stable_nightly: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + strategy: + matrix: + USE_NIGHTLY_OPENBLAS: [false, true] + env: + USE_NIGHTLY_OPENBLAS: ${{ matrix.USE_NIGHTLY_OPENBLAS }} + name: "Test Linux (${{ matrix.USE_NIGHTLY_OPENBLAS && 'nightly' || 'stable' }} OpenBLAS)" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + # Install OpenBLAS + set -xe + if [[ $USE_NIGHTLY_OPENBLAS == "true" ]]; then + target=$(python tools/openblas_support.py --nightly) + else + target=$(python tools/openblas_support.py) + fi + sudo cp -r $target/lib/* /usr/lib + sudo cp $target/include/* /usr/include + + - name: Build + shell: 'script -q -e -c "bash --noprofile --norc -eo pipefail {0}"' + env: + TERM: xterm-256color + run: + spin build -- --werror -Dallow-noblas=false + + - name: Check build-internal dependencies + run: + ninja -C build -t missingdeps + + - name: Check installed test and stub files + run: + python tools/check_installed_files.py $(find ./build-install -path '*/site-packages/numpy') + + - 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 + spin test -j auto + + + openblas_no_pkgconfig_fedora: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + container: fedora:39 + name: "OpenBLAS (Fedora, no pkg-config, LP64/ILP64)" + steps: + - name: Install system dependencies + run: | + dnf install git gcc-gfortran g++ python3-devel openblas-devel -y + + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install pytest hypothesis typing_extensions + + - name: Build (LP64) + run: spin build -- -Dblas=openblas -Dlapack=openblas -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + + - name: Build (ILP64) + run: | + rm -rf build + spin build -- -Duse-ilp64=true -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + + + flexiblas_fedora: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + container: fedora:39 + name: "FlexiBLAS (LP64, ILP64 on Fedora)" + steps: + - name: Install system dependencies + run: | + dnf install git gcc-gfortran g++ python3-devel flexiblas-devel -y + + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install pytest hypothesis typing_extensions + + - name: Build + run: spin build -- -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + + - name: Build (ILP64) + run: | + rm -rf build + spin build -- -Ddisable-optimization=true -Duse-ilp64=true -Dallow-noblas=false + + - name: Test (ILP64) + run: spin test -- numpy/linalg + + + openblas_cmake: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + name: "OpenBLAS with CMake" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install pytest pytest-xdist hypothesis typing_extensions + sudo apt-get install libopenblas-dev cmake + sudo apt-get remove pkg-config + + - name: Build + run: spin build -- -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -j auto -- numpy/linalg + + + netlib-debian: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + name: "Debian libblas/liblapack" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + sudo apt-get install liblapack-dev pkg-config + + - name: Build + run: | + spin build -- -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: | + pip install pytest pytest-xdist hypothesis typing_extensions + spin test -j auto -- numpy/linalg + + + netlib-split: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + container: opensuse/tumbleweed + name: "OpenSUSE Netlib BLAS/LAPACK" + steps: + - name: Install system dependencies + run: | + # No blas.pc on OpenSUSE as of Nov 2023, so no need to install pkg-config. + # If it is needed in the future, use install name `pkgconf-pkg-config` + zypper install -y git gcc-c++ python3-pip python3-devel blas cblas lapack + + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install PyPI dependencies + run: | + pip install --break-system-packages -r build_requirements.txt + + - name: Build + run: | + spin build -- -Dblas=blas -Dlapack=lapack -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: | + pip install --break-system-packages pytest pytest-xdist hypothesis typing_extensions + spin test -j auto -- numpy/linalg + + + mkl: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + name: "MKL (LP64, ILP64, SDL)" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install pytest pytest-xdist hypothesis typing_extensions + pip install mkl mkl-devel + + - name: Repair MKL pkg-config files and symlinks + run: | + # MKL 2023.2 works when installed from conda-forge (except for `-iomp` + # and `-tbb` pkg-config files), Spack, or with the standalone Intel + # installer. The standalone installer is the worst option, since it's + # large and clumsy to install and requires running a setvars.sh script + # before things work. The PyPI MKL packages are broken and need the + # fixes in this step. For details, see + # https://github.com/conda-forge/intel_repack-feedstock/issues/34 + cd $Python3_ROOT_DIR/lib/pkgconfig + sed -i 's/\/intel64//g' mkl*.pc + # add the expected .so -> .so.2 symlinks to fix linking + cd .. + for i in $( ls libmkl*.so.2 ); do ln -s $i ${i%.*}; done + + - name: Build with defaults (LP64) + run: | + pkg-config --libs mkl-dynamic-lp64-seq # check link flags + spin build -- -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + + - name: Build with ILP64 + run: | + git clean -xdf > /dev/null + pkg-config --libs mkl-dynamic-ilp64-seq + spin build -- -Duse-ilp64=true -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + + - name: Build without pkg-config (default options, SDL) + run: | + git clean -xdf > /dev/null + pushd $Python3_ROOT_DIR/lib/pkgconfig + rm mkl*.pc + popd + export MKLROOT=$Python3_ROOT_DIR + spin build -- -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + + blis: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + name: "BLIS" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install pytest pytest-xdist hypothesis typing_extensions + sudo apt-get install libblis-dev libopenblas-dev pkg-config + + - name: Add BLIS pkg-config file + run: | + # Needed because blis.pc missing in Debian: + # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=989076 + # The alternative here would be to use another distro or Miniforge + sudo cp tools/ci/_blis_debian.pc /usr/lib/x86_64-linux-gnu/pkgconfig/blis.pc + # Check if the patch works: + pkg-config --libs blis + pkg-config --cflags blis + + - name: Build + run: spin build -- -Dblas=blis -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + + atlas: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + name: "ATLAS" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install pytest pytest-xdist hypothesis typing_extensions + sudo apt-get install libatlas-base-dev pkg-config + + - name: Build + run: spin build -- -Dblas=blas-atlas -Dlapack=lapack-atlas -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test + run: spin test -- numpy/linalg + diff --git a/.github/workflows/linux_musl.yml b/.github/workflows/linux_musl.yml new file mode 100644 index 000000000000..5c65a2b2e8b9 --- /dev/null +++ b/.github/workflows/linux_musl.yml @@ -0,0 +1,69 @@ +name: Test musllinux_x86_64 + +on: + pull_request: + branches: + - main + - maintenance/** + + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + + +permissions: + contents: read # to fetch code (actions/checkout) + + +jobs: + musllinux_x86_64: + runs-on: ubuntu-latest + if: "github.repository == 'numpy/numpy'" + container: + # Use container used for building musllinux wheels + # it has git installed, all the pythons, etc + image: quay.io/pypa/musllinux_1_1_x86_64 + + steps: + - name: setup + run: | + apk update --quiet + + # using git commands to clone because versioneer doesn't work when + # actions/checkout is used for the clone step in a container + + git config --global --add safe.directory $PWD + + if [ $GITHUB_EVENT_NAME != pull_request ]; then + git clone --recursive --branch=$GITHUB_REF_NAME https://github.com/${GITHUB_REPOSITORY}.git $GITHUB_WORKSPACE + git reset --hard $GITHUB_SHA + else + git clone --recursive https://github.com/${GITHUB_REPOSITORY}.git $GITHUB_WORKSPACE + git fetch origin $GITHUB_REF:my_ref_name + git checkout $GITHUB_BASE_REF + git -c user.email="you@example.com" merge --no-commit my_ref_name + fi + git submodule update --init + + ln -s /usr/local/bin/python3.10 /usr/local/bin/python + + - name: test-musllinux_x86_64 + env: + PKG_CONFIG_PATH: ${{ github.workspace }}/.openblas + run: | + python -m venv test_env + source test_env/bin/activate + + pip install scipy-openblas64 + + pip install -r build_requirements.txt -r test_requirements.txt + + # use meson to build and test + spin build --with-scipy-openblas=64 -- -Duse-ilp64=true + spin test -j auto + + - name: Meson Log + shell: bash + run: | + cat build/meson-logs/meson-log.txt diff --git a/.github/workflows/linux_qemu.yml b/.github/workflows/linux_qemu.yml new file mode 100644 index 000000000000..31ceab851553 --- /dev/null +++ b/.github/workflows/linux_qemu.yml @@ -0,0 +1,157 @@ +# Meson's Python module doesn't support crosscompiling, +# and python dependencies may be another potential hurdle. +# There might also be a need to run runtime tests during configure time. +# +# The recommended practice is to rely on Docker to provide the x86_64 crosscompile toolchain, +# enabling native execution via binfmt. +# +# In simpler terms, everything except the crosscompile toolchain will be emulated. + +name: Linux Qemu tests + +on: + pull_request: + branches: + - main + - maintenance/** + +defaults: + run: + shell: bash + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + linux_qemu: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-22.04 + continue-on-error: true + strategy: + matrix: + BUILD_PROP: + - [ + "armhf", + "arm-linux-gnueabihf", + "arm32v7/ubuntu:22.04", + "-Dallow-noblas=true", + # test_unary_spurious_fpexception is currently skipped + # FIXME(@seiko2plus): Requires confirmation for the following issue: + # The presence of an FP invalid exception caused by sqrt. Unsure if this is a qemu bug or not. + "(test_kind or test_multiarray or test_simd or test_umath or test_ufunc) and not test_unary_spurious_fpexception" + ] + - [ + "ppc64le", + "powerpc64le-linux-gnu", + "ppc64le/ubuntu:22.04", + "-Dallow-noblas=true", + "test_kind or test_multiarray or test_simd or test_umath or test_ufunc", + ] + - [ + "ppc64le - baseline(Power9)", + "powerpc64le-linux-gnu", + "ppc64le/ubuntu:22.04", + "-Dallow-noblas=true -Dcpu-baseline=vsx3", + "test_kind or test_multiarray or test_simd or test_umath or test_ufunc", + ] + - [ + "s390x", + "s390x-linux-gnu", + "s390x/ubuntu:22.04", + "-Dallow-noblas=true", + # Skipping TestRationalFunctions.test_gcd_overflow test + # because of a possible qemu bug that appears to be related to int64 overflow in absolute operation. + # TODO(@seiko2plus): Confirm the bug and provide a minimal reproducer, then report it to upstream. + "(test_kind or test_multiarray or test_simd or test_umath or test_ufunc) and not test_gcd_overflow" + ] + - [ + "s390x - baseline(Z13)", + "s390x-linux-gnu", + "s390x/ubuntu:22.04", + "-Dallow-noblas=true -Dcpu-baseline=vx", + "(test_kind or test_multiarray or test_simd or test_umath or test_ufunc) and not test_gcd_overflow" + ] + env: + TOOLCHAIN_NAME: ${{ matrix.BUILD_PROP[1] }} + DOCKER_CONTAINER: ${{ matrix.BUILD_PROP[2] }} + MESON_OPTIONS: ${{ matrix.BUILD_PROP[3] }} + RUNTIME_TEST_FILTER: ${{ matrix.BUILD_PROP[4] }} + TERM: xterm-256color + + name: "${{ matrix.BUILD_PROP[0] }}" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + + - name: Initialize binfmt_misc for qemu-user-static + run: | + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + + - name: Install GCC cross-compilers + run: | + sudo apt update + sudo apt install -y ninja-build gcc-${TOOLCHAIN_NAME} g++-${TOOLCHAIN_NAME} gfortran-${TOOLCHAIN_NAME} + + - name: Cache docker container + uses: actions/cache@v3 + id: container-cache + with: + path: ~/docker_${{ matrix.BUILD_PROP[1] }} + key: container-${{ runner.os }}-${{ matrix.BUILD_PROP[1] }}-${{ matrix.BUILD_PROP[2] }}-${{ hashFiles('build_requirements.txt') }} + + - name: Creates new container + if: steps.container-cache.outputs.cache-hit != 'true' + run: | + docker run --name the_container --interactive -v /:/host -v $(pwd):/numpy ${DOCKER_CONTAINER} /bin/bash -c " + apt update && + apt install -y cmake git python3 python-is-python3 python3-dev python3-pip && + mkdir -p /lib64 && ln -s /host/lib64/ld-* /lib64/ && + ln -s /host/lib/x86_64-linux-gnu /lib/x86_64-linux-gnu && + rm -rf /usr/${TOOLCHAIN_NAME} && ln -s /host/usr/${TOOLCHAIN_NAME} /usr/${TOOLCHAIN_NAME} && + rm -rf /usr/lib/gcc/${TOOLCHAIN_NAME} && ln -s /host/usr/lib/gcc-cross/${TOOLCHAIN_NAME} /usr/lib/gcc/${TOOLCHAIN_NAME} && + rm -f /usr/bin/gcc && ln -s /host/usr/bin/${TOOLCHAIN_NAME}-gcc /usr/bin/gcc && + rm -f /usr/bin/g++ && ln -s /host/usr/bin/${TOOLCHAIN_NAME}-g++ /usr/bin/g++ && + rm -f /usr/bin/gfortran && ln -s /host/usr/bin/${TOOLCHAIN_NAME}-gfortran /usr/bin/gfortran && + rm -f /usr/bin/ar && ln -s /host/usr/bin/${TOOLCHAIN_NAME}-ar /usr/bin/ar && + rm -f /usr/bin/as && ln -s /host/usr/bin/${TOOLCHAIN_NAME}-as /usr/bin/as && + rm -f /usr/bin/ld && ln -s /host/usr/bin/${TOOLCHAIN_NAME}-ld /usr/bin/ld && + rm -f /usr/bin/ld.bfd && ln -s /host/usr/bin/${TOOLCHAIN_NAME}-ld.bfd /usr/bin/ld.bfd && + rm -f /usr/bin/ninja && ln -s /host/usr/bin/ninja /usr/bin/ninja && + git config --global --add safe.directory /numpy && + python -m pip install -r /numpy/build_requirements.txt && + python -m pip install pytest pytest-xdist hypothesis typing_extensions && + rm -f /usr/local/bin/ninja && mkdir -p /usr/local/bin && ln -s /host/usr/bin/ninja /usr/local/bin/ninja + " + docker commit the_container the_container + mkdir -p "~/docker_${TOOLCHAIN_NAME}" + docker save -o "~/docker_${TOOLCHAIN_NAME}/the_container.tar" the_container + + - name: Load container from cache + if: steps.container-cache.outputs.cache-hit == 'true' + run: docker load -i "~/docker_${TOOLCHAIN_NAME}/the_container.tar" + + - name: Meson Build + run: | + docker run --rm -e "TERM=xterm-256color" -v $(pwd):/numpy -v /:/host the_container \ + /bin/script -e -q -c "/bin/bash --noprofile --norc -eo pipefail -c ' + cd /numpy && spin build --clean -- ${MESON_OPTIONS} + '" + + - name: Meson Log + if: always() + run: 'cat build/meson-logs/meson-log.txt' + + - name: Run Tests + run: | + docker run --rm -e "TERM=xterm-256color" -v $(pwd):/numpy -v /:/host the_container \ + /bin/script -e -q -c "/bin/bash --noprofile --norc -eo pipefail -c ' + export F90=/usr/bin/gfortran + cd /numpy && spin test -- -k \"${RUNTIME_TEST_FILTER}\" + '" + diff --git a/.github/workflows/linux_simd.yml b/.github/workflows/linux_simd.yml new file mode 100644 index 000000000000..f8b694124d41 --- /dev/null +++ b/.github/workflows/linux_simd.yml @@ -0,0 +1,212 @@ +name: Linux SIMD tests + +# This file is meant for testing different SIMD-related build options and +# optimization levels. See `meson_options.txt` for the available build options. +# +# Jobs and their purposes: +# +# - baseline_only: +# Focuses on completing as quickly as possible and acts as a filter for other, more resource-intensive jobs. +# Utilizes only the default baseline targets (e.g., SSE3 on X86_64) without enabling any runtime dispatched features. +# +# - old_gcc: +# Tests the oldest supported GCC version with default CPU/baseline/dispatch settings. +# +# - without_optimizations: +# Completely disables all SIMD optimizations and other compiler optimizations such as loop unrolling. +# +# - native: +# Tests against the host CPU features set as the baseline without enabling any runtime dispatched features. +# Intended to assess the entire NumPy codebase against host flags, even for code sections lacking handwritten SIMD intrincis. +# +# - without_avx512/avx2/fma3: +# Uses runtime SIMD dispatching but disables AVX2, FMA3, and AVX512. +# Intended to evaluate 128-bit SIMD extensions without FMA support. +# +# - without_avx512: +# Uses runtime SIMD dispatching but disables AVX512. +# Intended to evaluate 128-bit/256-bit SIMD extensions. +# +# - intel_sde: +# Executes only the SIMD tests for various AVX512 SIMD extensions under the Intel Software Development Emulator (SDE). +# +on: + pull_request: + branches: + - main + - maintenance/** + +defaults: + run: + shell: 'script -q -e -c "bash --noprofile --norc -eo pipefail {0}"' + +env: + TERM: xterm-256color + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + baseline_only: + if: "github.repository == 'numpy/numpy'" + runs-on: ubuntu-latest + env: + MESON_ARGS: "-Dallow-noblas=true -Dcpu-dispatch=none" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.9' + - uses: ./.github/meson_actions + name: Build/Test + + old_gcc: + if: github.event_name != 'push' + needs: [baseline_only] + runs-on: ubuntu-latest + env: + MESON_ARGS: "-Dallow-noblas=true" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.9' + + - name: Install GCC/8/9 + run: | + echo "deb http://archive.ubuntu.com/ubuntu focal main universe" | sudo tee /etc/apt/sources.list.d/focal.list + sudo apt update + sudo apt install -y g++-8 g++-9 + + - name: Enable gcc-8 + run: | + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 1 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 1 + + - uses: ./.github/meson_actions + name: Build/Test against gcc-8 + + - name: Enable gcc-9 + run: | + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 2 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 2 + + - uses: ./.github/meson_actions + name: Build/Test against gcc-9 + + specialize: + needs: [baseline_only] + runs-on: ubuntu-latest + if: github.event_name != 'push' + continue-on-error: true + strategy: + matrix: + BUILD_PROP: + #- [ + #"without optimizations", + #"-Dallow-noblas=true -Ddisable-optimization=true", + #"3.12" + #] + - [ + "native", + "-Dallow-noblas=true -Dcpu-baseline=native -Dcpu-dispatch=none", + "3.11" + ] + - [ + "without avx512", + "-Dallow-noblas=true -Dcpu-dispatch=SSSE3,SSE41,POPCNT,SSE42,AVX,F16C,AVX2,FMA3", + "3.10" + ] + - [ + "without avx512/avx2/fma3", + "-Dallow-noblas=true -Dcpu-dispatch=SSSE3,SSE41,POPCNT,SSE42,AVX,F16C", + "3.9" + ] + + env: + MESON_ARGS: ${{ matrix.BUILD_PROP[1] }} + + name: "${{ matrix.BUILD_PROP[0] }}" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: "${{ matrix.BUILD_PROP[2] }}" + - uses: ./.github/meson_actions + name: Build/Test + + intel_sde: + needs: [baseline_only] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install Intel SDE + run: | + curl -o /tmp/sde.tar.xz https://downloadmirror.intel.com/784319/sde-external-9.24.0-2023-07-13-lin.tar.xz + mkdir /tmp/sde && tar -xvf /tmp/sde.tar.xz -C /tmp/sde/ + sudo mv /tmp/sde/* /opt/sde && sudo ln -s /opt/sde/sde64 /usr/bin/sde + + - name: Install dependencies + run: | + sudo apt update + sudo apt install -y g++-13 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 1 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 1 + python -m pip install -r build_requirements.txt + python -m pip install pytest pytest-xdist hypothesis typing_extensions + + - name: Build + run: spin build -- -Dallow-noblas=true -Dcpu-baseline=avx512f -Dtest-simd='BASELINE,AVX512_KNL,AVX512_KNM,AVX512_SKX,AVX512_CLX,AVX512_CNL,AVX512_ICL,AVX512_SPR' + + - name: Meson Log + if: always() + run: cat build/meson-logs/meson-log.txt + + - name: SIMD tests (KNM) + run: | + export NUMPY_SITE=$(realpath build-install/usr/lib/python*/site-packages/) + export PYTHONPATH="$PYTHONPATH:$NUMPY_SITE" + cd build-install && + sde -knm -- python -c "import numpy; numpy.show_config()" && + sde -knm -- python -m pytest $NUMPY_SITE/numpy/core/tests/test_simd* + + - name: SIMD tests (SPR) + run: | + export NUMPY_SITE=$(realpath build-install/usr/lib/python*/site-packages/) + export PYTHONPATH="$PYTHONPATH:$NUMPY_SITE" + cd build-install && + sde -spr -- python -c "import numpy; numpy.show_config()" && + sde -spr -- python -m pytest $NUMPY_SITE/numpy/core/tests/test_simd* + + # Can't run on SDE just yet: see https://github.com/numpy/numpy/issues/23545#issuecomment-1659047365 + # + #- name: linalg/ufunc/umath tests (SPR) + # run: | + # export NUMPY_SITE=$(realpath build-install/usr/lib/python*/site-packages/) + # export PYTHONPATH="$PYTHONPATH:$NUMPY_SITE" + # cd build-install && + # sde -spr -- python -c "import numpy; numpy.show_config()" && + # sde -spr -- python -m pytest $NUMPY_SITE/numpy/core/tests/test_umath* \ + # $NUMPY_SITE/numpy/core/tests/test_ufunc.py \ + # $NUMPY_SITE/numpy/linalg/tests/test_* + diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 000000000000..959b51e0626b --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,136 @@ +name: macOS tests (meson) + +on: + pull_request: + branches: + - main + - maintenance/** + +permissions: + contents: read # to fetch code (actions/checkout) + +env: + CCACHE_DIR: "${{ github.workspace }}/.ccache" + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + x86_conda: + name: macOS x86-64 conda + if: "github.repository == 'numpy/numpy'" + runs-on: macos-latest + strategy: + matrix: + python-version: ["3.11"] + + steps: + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + submodules: recursive + fetch-depth: 0 + + - name: Prepare cache dirs and timestamps + id: prep-ccache + shell: bash -l {0} + run: | + mkdir -p "${CCACHE_DIR}" + echo "dir=$CCACHE_DIR" >> $GITHUB_OUTPUT + NOW=$(date -u +"%F-%T") + echo "timestamp=${NOW}" >> $GITHUB_OUTPUT + echo "today=$(/bin/date -u '+%Y%m%d')" >> $GITHUB_OUTPUT + + - name: Setup compiler cache + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + id: cache-ccache + with: + path: ${{ steps.prep-ccache.outputs.dir }} + key: ${{ github.workflow }}-${{ matrix.python-version }}-ccache-macos-${{ steps.prep-ccache.outputs.timestamp }} + restore-keys: | + ${{ github.workflow }}-${{ matrix.python-version }}-ccache-macos- + + - name: Setup Mambaforge + uses: conda-incubator/setup-miniconda@3b0f2504dd76ef23b6d31f291f4913fb60ab5ff3 # v2.2.0 + with: + python-version: ${{ matrix.python-version }} + channels: conda-forge + channel-priority: true + activate-environment: numpy-dev + use-only-tar-bz2: false + miniforge-variant: Mambaforge + miniforge-version: latest + use-mamba: true + + # Updates if `environment.yml` or the date changes. The latter is needed to + # ensure we re-solve once a day (since we don't lock versions). Could be + # replaced by a conda-lock based approach in the future. + - name: Cache conda environment + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + env: + # Increase this value to reset cache if environment.yml has not changed + CACHE_NUMBER: 1 + with: + path: ${{ env.CONDA }}/envs/numpy-dev + key: + ${{ runner.os }}--${{ steps.prep-ccache.outputs.today }}-conda-${{ env.CACHE_NUMBER }}-${{ hashFiles('environment.yml') }} + id: envcache + + - name: Update Conda Environment + run: mamba env update -n numpy-dev -f environment.yml + if: steps.envcache.outputs.cache-hit != 'true' + + - name: Build and Install NumPy + shell: bash -l {0} + run: | + conda activate numpy-dev + CC="ccache $CC" spin build -j2 -- -Dallow-noblas=false + + - name: Run test suite (full) + shell: bash -l {0} + run: | + conda activate numpy-dev + export OMP_NUM_THREADS=2 + spin test -j2 -m full + + - name: Ccache statistics + shell: bash -l {0} + run: | + conda activate numpy-dev + ccache -s + + accelerate: + name: Accelerate (LP64, ILP64) + if: "github.repository == 'numpy/numpy'" + runs-on: macos-13 + steps: + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + submodules: recursive + fetch-depth: 0 + + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.10' + + - uses: maxim-lobanov/setup-xcode@9a697e2b393340c3cacd97468baa318e4c883d98 # v1.5.1 + with: + xcode-version: '14.3' + + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install pytest pytest-xdist hypothesis + + - name: Build against Accelerate (LP64) + run: spin build -- -Ddisable-optimization=true -Dallow-noblas=false + + - name: Test (linalg only) + run: spin test -j2 -- numpy/linalg + + - name: Build NumPy against Accelerate (ILP64) + run: | + spin build -- -Duse-ilp64=true -Dallow-noblas=false + + - name: Test (fast tests) + run: spin test -j2 diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml new file mode 100644 index 000000000000..c89b8e11ec95 --- /dev/null +++ b/.github/workflows/mypy.yml @@ -0,0 +1,67 @@ +name: Run MyPy + +# Mypy is too slow to run as part of regular CI. The purpose of the jobs in +# this file is to cover running Mypy across: +# +# - OSes: Linux, Windows and macOS +# - Python versions: lowest/highest supported versions, and an intermediate one +# +# The build matrix aims for sparse coverage across those two dimensions. +# Use of BLAS/LAPACK and SIMD is disabled on purpose, because those things +# don't matter for static typing and this speeds up the builds. +# +# This is a separate job file so it's easy to trigger by hand. + +on: + pull_request: + branches: + - main + - maintenance/** + paths-ignore: + - 'benchmarks/' + - '.circlecl/' + - 'docs/' + - 'meson_cpu/' + - 'tools/' + workflow_dispatch: + +defaults: + run: + shell: bash + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + mypy: + if: "github.repository == 'numpy/numpy'" + name: "MyPy" + runs-on: ${{ matrix.os_python[0] }} + strategy: + matrix: + os_python: + - [ubuntu-latest, '3.10'] # switch to 3.12-dev after mypy is upgraded (see gh-23764) + - [windows-2019, '3.11'] + - [macos-12, '3.9'] + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + submodules: recursive + fetch-depth: 0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: ${{ matrix.os_python[1] }} + - name: Install dependencies + run: | + pip install -r build_requirements.txt + pip install -r test_requirements.txt + - name: Build + run: | + spin build -j2 -- -Dallow-noblas=true -Ddisable-optimization=true --vsenv + - name: Run Mypy + run: | + spin mypy diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml new file mode 100644 index 000000000000..6e9dfa0a445f --- /dev/null +++ b/.github/workflows/scorecards.yml @@ -0,0 +1,55 @@ +name: Scorecards supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: "19 23 * * 5" + push: + branches: ["main"] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecards analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@08b4669551908b1024bb425080c797723083c031 # v2.2.0 + with: + results_file: results.sarif + results_format: sarif + # Publish results to OpenSSF REST API for easy access by consumers. + # Allows the repository to include the Scorecard badge. + # See https://github.com/ossf/scorecard-action#publishing-results. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable + # uploads of run results in SARIF format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@cdcdbb579706841c47f7063dda365e292e5cad7a # v2.1.27 + with: + sarif_file: results.sarif diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml new file mode 100644 index 000000000000..76757f6f097d --- /dev/null +++ b/.github/workflows/wheels.yml @@ -0,0 +1,248 @@ +# Workflow to build and test wheels. +# To work on the wheel building infrastructure on a fork, comment out: +# +# if: github.repository == 'numpy/numpy' +# +# in the get_commit_message job. Be sure to include [wheel build] in your commit +# message to trigger the build. All files related to wheel building are located +# at tools/wheels/ +# Alternatively, you can add labels to the pull request in order to trigger wheel +# builds. +# The labels that trigger builds are: +# 36 - Build(for changes to the building process, +# 14 - Release(ensure wheels build before release) +name: Wheel builder + +on: + schedule: + # ┌───────────── minute (0 - 59) + # │ ┌───────────── hour (0 - 23) + # │ │ ┌───────────── day of the month (1 - 31) + # │ │ │ ┌───────────── month (1 - 12 or JAN-DEC) + # │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT) + # │ │ │ │ │ + - cron: "42 2 * * SUN,WED" + push: + pull_request: + types: [labeled, opened, synchronize, reopened] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + get_commit_message: + name: Get commit message + runs-on: ubuntu-latest + if: "github.repository == 'numpy/numpy'" + outputs: + message: ${{ steps.commit_message.outputs.message }} + steps: + - name: Checkout numpy + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + # Gets the correct commit message for pull request + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Get commit message + id: commit_message + run: | + set -xe + COMMIT_MSG=$(git log --no-merges -1 --oneline) + echo "message=$COMMIT_MSG" >> $GITHUB_OUTPUT + echo github.ref ${{ github.ref }} + + build_wheels: + name: Build wheel for ${{ matrix.python }}-${{ matrix.buildplat[1] }} + needs: get_commit_message + if: >- + contains(needs.get_commit_message.outputs.message, '[wheel build]') || + github.event_name == 'schedule' || + github.event_name == 'workflow_dispatch' || + (github.event_name == 'pull_request' && + (contains(github.event.pull_request.labels.*.name, '36 - Build') || + contains(github.event.pull_request.labels.*.name, '14 - Release'))) || + (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') && ( ! endsWith(github.ref, 'dev0'))) + runs-on: ${{ matrix.buildplat[0] }} + strategy: + # Ensure that a wheel builder finishes even if another fails + fail-fast: false + matrix: + # Github Actions doesn't support pairing matrix values together, let's improvise + # https://github.com/github/feedback/discussions/7835#discussioncomment-1769026 + buildplat: + - [ubuntu-20.04, manylinux_x86_64] + - [ubuntu-20.04, musllinux_x86_64] + - [macos-12, macosx_x86_64] + - [windows-2019, win_amd64] + - [windows-2019, win32] + python: ["cp39", "cp310", "cp311", "cp312", "pp39"] + exclude: + # Don't build PyPy 32-bit windows + - buildplat: [windows-2019, win32] + python: "pp39" + - buildplat: [ ubuntu-20.04, musllinux_x86_64 ] + python: "pp39" + env: + IS_32_BIT: ${{ matrix.buildplat[1] == 'win32' }} + IS_PUSH: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }} + IS_SCHEDULE_DISPATCH: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + steps: + - name: Checkout numpy + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + submodules: true + # versioneer.py requires the latest tag to be reachable. Here we + # fetch the complete history to get access to the tags. + # A shallow clone can work when the following issue is resolved: + # https://github.com/actions/checkout/issues/338 + fetch-depth: 0 + + - name: Setup MSVC (32-bit) + if: ${{ matrix.buildplat[1] == 'win32' }} + uses: bus1/cabuild/action/msdevshell@e22aba57d6e74891d059d66501b6b5aed8123c4d # v1 + with: + architecture: 'x86' + + - name: pkg-config-for-win + run: | + choco install -y --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite + if: runner.os == 'windows' + + # Used to push the built wheels + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: "3.x" + + - name: Build wheels + uses: pypa/cibuildwheel@a873dd9cbf9e3c4c73a1fd11ac31cf835f6eb502 # v2.16.0 + #uses: pypa/cibuildwheel@fff9ec32ed25a9c576750c91e06b410ed0c15db7 # v2.16.2 + env: + CIBW_PRERELEASE_PYTHONS: True + CIBW_BUILD: ${{ matrix.python }}-${{ matrix.buildplat[1] }} + + - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: ${{ matrix.python }}-${{ startsWith(matrix.buildplat[1], 'macosx') && 'macosx' || matrix.buildplat[1] }} + path: ./wheelhouse/*.whl + + - uses: conda-incubator/setup-miniconda@3b0f2504dd76ef23b6d31f291f4913fb60ab5ff3 # v2.2.0 + with: + # for installation of anaconda-client, required for upload to + # anaconda.org + # default (and activated) environment name is test + # Note that this step is *after* specific pythons have been used to + # build and test the wheel + auto-update-conda: true + python-version: "3.10" + + - name: Upload wheels + if: success() + shell: bash -el {0} + # see https://github.com/marketplace/actions/setup-miniconda for why + # `-el {0}` is required. + env: + NUMPY_STAGING_UPLOAD_TOKEN: ${{ secrets.NUMPY_STAGING_UPLOAD_TOKEN }} + NUMPY_NIGHTLY_UPLOAD_TOKEN: ${{ secrets.NUMPY_NIGHTLY_UPLOAD_TOKEN }} + run: | + #conda install -y anaconda-client + # pin urllib3 until anaconda-client is fixed upstream + conda install -y anaconda-client 'urllib3<2.0.0' + source tools/wheels/upload_wheels.sh + set_upload_vars + # trigger an upload to + # https://anaconda.org/scientific-python-nightly-wheels/numpy + # for cron jobs or "Run workflow" (restricted to main branch). + # Tags will upload to + # https://anaconda.org/multibuild-wheels-staging/numpy + # The tokens were originally generated at anaconda.org + upload_wheels + + build_sdist: + name: Build sdist + needs: get_commit_message + if: >- + contains(needs.get_commit_message.outputs.message, '[wheel build]') || + github.event_name == 'schedule' || + github.event_name == 'workflow_dispatch' || + (github.event_name == 'pull_request' && + (contains(github.event.pull_request.labels.*.name, '36 - Build') || + contains(github.event.pull_request.labels.*.name, '14 - Release'))) || + (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') && ( ! endsWith(github.ref, 'dev0'))) + runs-on: ubuntu-latest + env: + IS_PUSH: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') }} + # commented out so the sdist doesn't upload to nightly + # IS_SCHEDULE_DISPATCH: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + steps: + - name: Checkout numpy + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + submodules: true + # versioneer.py requires the latest tag to be reachable. Here we + # fetch the complete history to get access to the tags. + # A shallow clone can work when the following issue is resolved: + # https://github.com/actions/checkout/issues/338 + fetch-depth: 0 + # Used to push the built wheels + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + # Build sdist on lowest supported Python + python-version: "3.9" + - name: Build sdist + run: | + python -m pip install -U pip build + python -m build --sdist -Csetup-args=-Dallow-noblas=true + - name: Test the sdist + run: | + # TODO: Don't run test suite, and instead build wheels from sdist + # Depends on pypa/cibuildwheel#1020 + python -m pip install dist/*.gz -Csetup-args=-Dallow-noblas=true + pip install ninja + pip install -r test_requirements.txt + cd .. # Can't import numpy within numpy src directory + python -c "import numpy, sys; print(numpy.__version__); sys.exit(numpy.test() is False)" + + - name: Check README rendering for PyPI + run: | + python -mpip install twine + twine check dist/* + + - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: sdist + path: ./dist/* + + - uses: conda-incubator/setup-miniconda@3b0f2504dd76ef23b6d31f291f4913fb60ab5ff3 # v2.2.0 + with: + # for installation of anaconda-client, required for upload to + # anaconda.org + # default (and activated) environment name is test + # Note that this step is *after* specific pythons have been used to + # build and test + auto-update-conda: true + python-version: "3.10" + + - name: Upload sdist + if: success() + shell: bash -el {0} + env: + NUMPY_STAGING_UPLOAD_TOKEN: ${{ secrets.NUMPY_STAGING_UPLOAD_TOKEN }} + # commented out so the sdist doesn't upload to nightly + # NUMPY_NIGHTLY_UPLOAD_TOKEN: ${{ secrets.NUMPY_NIGHTLY_UPLOAD_TOKEN }} + run: | + #conda install -y anaconda-client + # pin urllib3 until anaconda-client is fixed upstream + conda install -y anaconda-client 'urllib3<2.0.0' + source tools/wheels/upload_wheels.sh + set_upload_vars + # trigger an upload to + # https://anaconda.org/scientific-python-nightly-wheels/numpy + # for cron jobs or "Run workflow" (restricted to main branch). + # Tags will upload to + # https://anaconda.org/multibuild-wheels-staging/numpy + # The tokens were originally generated at anaconda.org + upload_wheels diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 000000000000..988a55b761db --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,114 @@ +name: Windows tests + +on: + pull_request: + branches: + - main + - maintenance/** + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + python64bit_openblas: + name: x86-64, LP64 OpenBLAS + runs-on: windows-2019 + if: "github.repository == 'numpy/numpy'" + strategy: + matrix: + compiler: ["MSVC", "Clang-cl"] + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + + - name: Setup Python + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.11' + + - name: Install build dependencies from PyPI + run: | + python -m pip install spin Cython + + - name: Install pkg-config + run: | + choco install -y --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite + + - name: Install Clang-cl + if: matrix.compiler == 'Clang-cl' + run: | + choco install llvm -y --version=16.0.6 + + - name: Install NumPy (MSVC) + if: matrix.compiler == 'MSVC' + env: + PKG_CONFIG_PATH: ${{ github.workspace }}/.openblas + run: | + python -m pip install scipy-openblas32 + 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 + python -m pip install scipy-openblas32 + spin build --with-scipy-openblas=32 -j2 -- --vsenv --native-file=$PWD/clang-cl-build.ini + + - name: Meson Log + shell: bash + if: ${{ failure() }} + run: | + cat build/meson-logs/meson-log.txt + + - name: Install test dependencies + run: | + python -m pip install -r test_requirements.txt + python -m pip install threadpoolctl + + - name: Run test suite + run: | + spin test + + msvc_32bit_python_no_openblas: + name: MSVC, 32-bit Python, no BLAS + runs-on: windows-2019 + if: "github.repository == 'numpy/numpy'" + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + submodules: recursive + fetch-depth: 0 + + - name: Setup Python (32-bit) + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 + with: + python-version: '3.10' + architecture: 'x86' + + - name: Setup MSVC (32-bit) + uses: bus1/cabuild/action/msdevshell@e22aba57d6e74891d059d66501b6b5aed8123c4d # v1 + with: + architecture: 'x86' + + - name: Build and install + run: | + python -m pip install . -v -Ccompile-args="-j2" -Csetup-args="-Dallow-noblas=true" + + - name: Install test dependencies + run: | + python -m pip install -r test_requirements.txt + + - name: Run test suite (fast) + run: | + cd tools + python -m pytest --pyargs numpy -m "not slow" -n2 diff --git a/.gitignore b/.gitignore index 2ad02b56017a..3de77ebc4cac 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ GRTAGS GSYMS GTAGS .cache +.mypy_cache/ # Compiled source # ################### @@ -60,13 +61,17 @@ GTAGS # Python files # ################ -# setup.py working directory +# meson build/installation directories build +build-install +# meson python output +.mesonpy-native-file.ini # sphinx build directory _build # setup.py dist directory dist doc/build +doc/docenv doc/cdoc/build # Egg metadata *.egg-info @@ -74,6 +79,8 @@ doc/cdoc/build ./.shelf MANIFEST .cache +pip-wheel-metadata +.python-version # Paver generated files # ######################### @@ -105,36 +112,40 @@ Thumbs.db ########################## /.pytest_cache +# doc build generated files # +############################# +doc/source/savefig/ + + # Things specific to this project # ################################### +# The line below should change to numpy/_version.py for NumPy 2.0 +numpy/version.py numpy/core/__svn_version__.py doc/numpy.scipy.org/_build numpy/__config__.py numpy/core/include/numpy/__multiarray_api.h numpy/core/include/numpy/__ufunc_api.h numpy/core/include/numpy/_numpyconfig.h -numpy/version.py site.cfg -setup.cfg .tox numpy/core/include/numpy/__multiarray_api.c numpy/core/include/numpy/__ufunc_api.c numpy/core/include/numpy/__umath_generated.c +numpy/core/include/numpy/_umath_doc_generated.h numpy/core/include/numpy/config.h -numpy/core/include/numpy/multiarray_api.txt -numpy/core/include/numpy/ufunc_api.txt numpy/core/lib/ -numpy/core/src/common/npy_binsearch.h -numpy/core/src/common/npy_partition.h numpy/core/src/common/npy_sort.h numpy/core/src/common/templ_common.h numpy/core/src/multiarray/_multiarray_tests.c numpy/core/src/multiarray/arraytypes.c numpy/core/src/multiarray/einsum.c +numpy/core/src/multiarray/einsum_sumprod.c numpy/core/src/multiarray/lowlevel_strided_loops.c numpy/core/src/multiarray/multiarray_tests.c numpy/core/src/multiarray/nditer_templ.c numpy/core/src/multiarray/scalartypes.c +numpy/core/src/multiarray/textreading/tokenize.c numpy/core/src/npymath/ieee754.c numpy/core/src/npymath/npy_math_complex.c numpy/core/src/npymath/npy_math_internal.h @@ -149,9 +160,6 @@ numpy/core/src/npysort/sort.c numpy/core/src/private/npy_binsearch.h numpy/core/src/private/npy_partition.h numpy/core/src/private/templ_common.h -numpy/core/src/umath/_operand_flag_tests.c -numpy/core/src/umath/_rational_tests.c -numpy/core/src/umath/_struct_ufunc_tests.c numpy/core/src/umath/_umath_tests.c numpy/core/src/umath/scalarmath.c numpy/core/src/umath/funcs.inc @@ -163,6 +171,8 @@ numpy/core/src/umath/simd.inc numpy/core/src/umath/struct_ufunc_test.c numpy/core/src/umath/test_rational.c numpy/core/src/umath/umath_tests.c +numpy/core/src/umath/loops_utils.h +numpy/core/src/umath/loops_modulo.dispatch.c numpy/distutils/__config__.py numpy/linalg/umath_linalg.c doc/source/**/generated/ @@ -170,6 +180,8 @@ benchmarks/results benchmarks/html benchmarks/env benchmarks/numpy +benchmarks/_asv_compare.conf.json +test.obj # cythonized files cythonize.dat numpy/random/_mtrand/_mtrand.c @@ -178,3 +190,44 @@ numpy/random/legacy/*.c numpy/random/_mtrand/randint_helpers.pxi numpy/random/bounded_integers.pyx numpy/random/bounded_integers.pxd +numpy/random/lib/npyrandom.lib +tools/swig/test/Array_wrap.cxx +tools/swig/test/Farray_wrap.cxx +tools/swig/test/Farray.py +tools/swig/test/Flat_wrap.cxx +tools/swig/test/Flat.py +tools/swig/test/Fortran_wrap.cxx +tools/swig/test/Fortran.py +tools/swig/test/Matrix_wrap.cxx +tools/swig/test/Matrix.py +tools/swig/test/Tensor_wrap.cxx +tools/swig/test/Tensor.py +tools/swig/test/Vector.py +tools/swig/test/Vector_wrap.cxx +tools/swig/test/Array.py + +# SIMD generated files # +################################### +# _simd module +numpy/core/src/_simd/_simd.dispatch.c +numpy/core/src/_simd/_simd_data.inc +numpy/core/src/_simd/_simd_inc.h +# umath module +numpy/core/src/umath/loops_unary.dispatch.c +numpy/core/src/umath/loops_unary_fp.dispatch.c +numpy/core/src/umath/loops_unary_fp_le.dispatch.c +numpy/core/src/umath/loops_arithm_fp.dispatch.c +numpy/core/src/umath/loops_arithmetic.dispatch.c +numpy/core/src/umath/loops_logical.dispatch.c +numpy/core/src/umath/loops_minmax.dispatch.c +numpy/core/src/umath/loops_trigonometric.dispatch.c +numpy/core/src/umath/loops_exponent_log.dispatch.c +numpy/core/src/umath/loops_umath_fp.dispatch.c +numpy/core/src/umath/loops_hyperbolic.dispatch.c +numpy/core/src/umath/loops_modulo.dispatch.c +numpy/core/src/umath/loops_comparison.dispatch.c +numpy/core/src/umath/loops_unary_complex.dispatch.c +numpy/core/src/umath/loops_autovec.dispatch.c +# multiarray module +numpy/core/src/multiarray/argfunc.dispatch.c +numpy/core/src/multiarray/arraytypes.h diff --git a/.gitmodules b/.gitmodules index 1b0706f658e2..27ee5e6625eb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,15 @@ -[submodule "doc/scipy-sphinx-theme"] - path = doc/scipy-sphinx-theme - url = https://github.com/scipy/scipy-sphinx-theme.git -[submodule "doc/sphinxext"] - path = doc/sphinxext - url = https://github.com/numpy/numpydoc.git +[submodule "doc/source/_static/scipy-mathjax"] + path = doc/source/_static/scipy-mathjax + url = https://github.com/scipy/scipy-mathjax.git +[submodule "numpy/core/src/umath/svml"] + path = numpy/core/src/umath/svml + url = https://github.com/numpy/SVML.git +[submodule "numpy/core/src/npysort/x86-simd-sort"] + path = numpy/core/src/npysort/x86-simd-sort + url = https://github.com/intel/x86-simd-sort +[submodule "vendored-meson/meson"] + path = vendored-meson/meson + url = https://github.com/numpy/meson.git +[submodule "vendored-meson/meson-python"] + path = vendored-meson/meson-python + url = https://github.com/numpy/meson-python.git diff --git a/.lgtm.yml b/.lgtm.yml index cc16544a3759..242afd59708a 100644 --- a/.lgtm.yml +++ b/.lgtm.yml @@ -1,6 +1,7 @@ path_classifiers: library: - tools + - numpy/_version.py generated: # The exports defined in __init__.py are defined in the Cython module # np.random.mtrand. By excluding this file we suppress a number of diff --git a/.mailmap b/.mailmap index 9d7aaa3c43dc..21f4af76ecc3 100644 --- a/.mailmap +++ b/.mailmap @@ -8,231 +8,606 @@ # This file is up-to-date if the command git log --format="%aN <%aE>" | sort -u # gives no duplicates. -Aaron Baecker abaecker -Alan Fontenot logeaux -Alan Fontenot logeaux <36168460+logeaux@users.noreply.github.com> -Abdul Muneer abdulmuneer -Adam Ginsburg Adam Ginsburg -Albert Jornet Puig jurnix -Alex Griffing alex -Alex Griffing argriffing -Alex Griffing argriffing -Alex Griffing argriffing -Alex Thomas alexthomas93 -Alexander Belopolsky Alexander Belopolsky -Alexander Belopolsky Alexander Belopolsky +@8bitmp3 <19637339+8bitmp3@users.noreply.github.com> +@DWesl <22566757+DWesl@users.noreply.github.com> +@Endolith +@GalaxySnail +@Illviljan <14371165+Illviljan@users.noreply.github.com> +@LSchroefl <65246829+LSchroefl@users.noreply.github.com> +@Lbogula +@Lisa <34400837+lyzlisa@users.noreply.github.com> +@Patrick <39380924+xamm@users.noreply.github.com> +@Scian <65375075+hoony6134@users.noreply.github.com> +@amagicmuffin <2014wcheng@gmail.com> +@code-review-doctor +@dg3192 <113710955+dg3192@users.noreply.github.com> +@h-vetinari +@h6197627 <44726212+h6197627@users.noreply.github.com> +@jbCodeHub +@juztamau5 +@legoffant <58195095+legoffant@users.noreply.github.com> +@luzpaz +@luzpaz +@partev +@pkubaj +@pmvz +@pratiklp00 +@sfolje0 +@spacescientist +@tajbinjohn +@tautaus +@xoviat <49173759+xoviat@users.noreply.github.com> +@xoviat <49173759+xoviat@users.noreply.github.com> +@yan-wyb +@yetanothercheer +Aaron Baecker +Arun Kota +Arun Kota Arun Kota +Aarthi Agurusa +Adarsh Singh ADARSH SINGH +Andrei Batomunkuev +Ajay DS +Ajay DS +Alan Fontenot +Alan Fontenot <36168460+logeaux@users.noreply.github.com> +Abdul Muneer +Abhilash Barigidad +Abhilash Barigidad <64172584+abhilash42@users.noreply.github.com> +Abhinav Reddy +Abel Aoun +Adam Ginsburg +Aerik Pawson <45904740+aerikpawson@users.noreply.github.com> +Ahmet Can Solak +Amrit Krishnan +Amrit Krishnan +Alban Desmaison +Albert Jornet Puig +Alberto Rubiales +Ales Crocaro +Alex Rockhill +Alex Griffing +Alex Griffing +Alex Griffing +Alex Henrie +Alex Low +Alex Rogozhnikov +Alex Thomas +Alexander Belopolsky +Alexander Belopolsky +Alexander Belopolsky Alexander Belopolsky sasha -Alexander Jung aleju -Alexander Shadchin Alexandr Shadchin -Alexander Shadchin shadchin -Allan Haldane ahaldane +Alexander Hunt +Alexander Jung +Alexander Shadchin +Alexander Shadchin +AlizÊ Papp <68250865+alize-papp@users.noreply.github.com> +Allan Haldane +Al-Baraa El-Hag <48454648+a-elhag@users.noreply.github.com> Alok Singhal Alok Singhal -Alyssa Quek alyssaq -Amir Sarabadani amir -Anatoly Techtonik anatoly techtonik -Andras Deak adeak -Andrea Pattori patto90 -Andrei Kucharavy chiffa -Anne Archibald aarchiba -Anne Archibald Anne Archibald -AnÅže Starič astaric -Aron Ahmadia ahmadia -Aarthi Agurusa agurusa -Arun Persaud Arun Persaud -Åsmund Hjulstad Åsmund Hjulstad -Auke Wiggers auke -Badhri Narayanan Krishnakumar badhrink -Behzad Nouri behzad nouri -Benjamin Root Ben Root +Alyssa Quek +Ankit Dwivedi +Ankit Dwivedi +Amir Sarabadani +Anas Khan +Anatoly Techtonik +Andras Deak +Andrea Olivo +Andrea Pattori +Andrea Sangalli <53617841+and-sang@users.noreply.github.com> +Andreas KlÃļckner +Andreas Schwab +Andrei Kucharavy +Andrew Lawson +Anirudh Subramanian +Anne Archibald +Anne Archibald +Anne Bonner <35413198+bonn0062@users.noreply.github.com> +Anthony Vo <43098273+anthonyhvo12@users.noreply.github.com> +Antoine Pitrou +Anton Prosekin +AnÅže Starič +Arfy Slowy +Aron Ahmadia +Arun Kota +Arun Kota +Arun Palaniappen +Arun Persaud +Ashutosh Singh +Ashutosh Singh <55102089+Ashutosh619-sudo@users.noreply.github.com> +Åsmund Hjulstad +Auke Wiggers +Badhri Narayanan Krishnakumar +Bhavuk Kalra +Bhavuk Kalra +Bangcheng Yang +Bhargav V <12525622+brpy@users.noreply.github.com> +Bas van Beek <43369155+BvB93@users.noreply.github.com> +Behzad Nouri +Ben Nathanson +Benjamin Root Benjamin Root weathergod -Bernardt Duvenhage bduvenhage -Bertrand Lefebvre bertrand -Bertrand Lefebvre Bertrand -Bharat Raghunathan Bharat123Rox -Bill Spotz William Spotz -Bill Spotz wfspotz@sandia.gov -Bob Eldering bobeldering -Brett R Murphy brettrmurphy +Bernardt Duvenhage +Bernie Gray +Bertrand Lefebvre +Bharat Raghunathan +Bharat Raghunathan +Bob Eldering +Bram Ton +Bram Ton +Bram Ton +Brent Brewington +Brett R Murphy +Brian Soto +Brian Soto +Brian Soto +Brigitta SipoĖ‹cz +Brigitta SipoĖ‹cz +Brock Mendel Bryan Van de Ven Bryan Van de Ven Bryan Van de Ven Bryan Van de Ven -Carl Kleffner carlkl -Chris Burns chris.burns -Chris Kerr Chris Kerr -Christian Clauss cclauss -Christopher Hanley chanley +BrÊnainn Woodsend +Bui Duc Minh <41239569+Mibu287@users.noreply.github.com> +Caio Agiani +Carl Kleffner +Carl Leake +CÊdric Hannotier +Charles Stern <62192187+cisaacstern@users.noreply.github.com> +Chiara Marmo +Chiara Marmo +Chiara Marmo +Chris Barker +Chris Burns +Chris Fu (傅įĢ‹ä¸š) <17433201@qq.com> +Chris Holland <41524756+ChrisAHolland@users.noreply.github.com> +Chris Kerr +Chris Vavaliaris +Christian Clauss +Christopher Dahlin +Christopher Hanley +Christoph Gohlke +Christoph Gohlke Christoph Gohlke cgholke -Christoph Gohlke cgohlke -Christoph Gohlke Christolph Gohlke -Daniel B Allan danielballan -Daniel da Silva Daniel da Silva -Daniel da Silva Daniel da Silva -Daniel Hrisca danielhrisca -Daniel J Farrell danieljfarrell +Chun-Wei Chen +Chunlin Fang +Chunlin Fang <834352945@qq.com> +Chunlin Fang +Colin Snyder <8csnyder@gmail.com> <47012605+colinsnyder@users.noreply.github.com> +Constanza Fierro +Dahyun Kim +Daniel B Allan +Daniel da Silva +Daniel da Silva +Daniel Hrisca +Daniel J Farrell +Daniel Montes <53720019+Aerysv@users.noreply.github.com> +Daniel MÃŧllner Daniel MÃŧllner Daniel -Daniel MÃŧllner dmuellner -Daniel Rasmussen drasmuss +Daniel Rasmussen +Daniel G. A. Smith +Daniel G. A. Smith +Dario Mory +Dave Goel +David Badnar +David Cortes David Huard dhuard -David M Cooke cookedm -David Nicholson davidjn -David Ochoa ochoadavid -Dawid Zych silenc3r -Dennis Zollo denniszollo -Derek Homeier Derek Homeier -Derek Homeier Derek Homeir -Derek Homeier Derek Homier -Derrick Williams derrick -Dmitriy Shalyga zuko3d -Ed Schofield edschofield -Egor Zindy zindy -Endolith +David M Cooke +David Nicholson +David Ochoa +David Pitchford +David Prosin +Davide Dal Bosco <62077652+davidedalbosco@users.noreply.github.com> +Dawid Zych +Dennis Zollo +Derek Homeier +Derek Homeier +Derek Homeier +Derrick Williams +Devin Shanahan +Digya Acharya +Dima Pasechnik +Dima Pasechnik +Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> +Ding Liu +Ding Liu +Dmitriy Shalyga +Dmitry Belov +Dustan Levenstein <43019642+dustanlevenstein@users.noreply.github.com> +Dylan Cutler +Ed Schofield +Egor Zindy +Elliott M. Forney +Erik M. Bray +Erik M. Bray +Erik M. Bray Eric Fode Eric Fode -Eric Quintero e-q -Ernest N. Mamikonyan mamikony +Eric Quintero +Ernest N. Mamikonyan +Eskild Eriksen +Eskild Eriksen <42120229+iameskild@users.noreply.github.com> +Eskild Eriksen +Etienne Guesnet <51407514+EGuesnet@users.noreply.github.com> +Eva Jau Evgeni Burovski Evgeni Burovski -Evgeny Toder eltjpm -Fernando Perez Fernando Perez +Evgeny Toder +Fernando Perez +Filip Trojan +François Le Lay +Frank Breitling Friedrich Dunne dunneff Frederic Bastien Frederic -Gael Varoquaux GaelVaroquaux -Gerrit Holl Gerrit Holl -Giuseppe Venturini ggventurini -Golnaz Irannejad golnazir -Gopal Singh Meena gopalmeena -Greg Knoll gkBCCN -Greg Yang eulerreich -Greg Young gfyoung -Greg Young gfyoung +FX Coudert +Gael Varoquaux +Gagandeep Singh +Gavin Zhang +Gerrit Holl +Gerrit Holl +Giuseppe Venturini +Golnaz Irannejad +Gopal Singh Meena +Greg Knoll +Greg Yang +Greg Young +Greg Young +Gregory R. Lee +Gregory R. Lee Guo Ci guoci -Han Genuit 87 -Han Genuit hangenuit@gmail.com -Han Genuit Han +Guo Shuai +Hameer Abbasi +Hannah Aizenman +Han Genuit Hanno Klemm hklemm -Hemil Desai hemildesai -Hiroyuki V. Yamazaki hvy -Gerhard Hobler hobler -Irvin Probst I--P -Jaime Fernandez Jaime Fernandez -Jaime Fernandez jaimefrio -Jaime Fernandez Jaime -James Webber jamestwebber +Harsh Mishra +Helder Oliveira +Hemil Desai +Himanshu +Hiroyuki V. Yamazaki +Hugo van Kemenade +Iantra Solari +I-Shen Leong +Imen Rajhi +Inessa Pawson +Irina Maria Mocan <28827042+IrinaMaria@users.noreply.github.com> +Irvin Probst +Ivan Meleshko +Isabela Presedo-Floyd +Ganesh Kathiresan +Gerhard Hobler +Giannis Zapantis +Guillaume Peillex +Jack J. Woehr +Jaime Fernandez +Jaime Fernandez +Jaime Fernandez +Jake Close +Jakob Jakobson +Jakob Jakobson <43045863+jakobjakobson13@users.noreply.github.com> +James Bourbeau +James Webber +Jamie Macey +Jan SchlÃŧter +Janus Heide Jarrod Millman Jarrod Millman -Jason Grout Jason Grout -Jason King jason king -Jay Bourque jayvius -Jean Utke jutke -Jeffrey Yancey Jeff <3820914+jeffyancey@users.noreply.github.com> -Jeremy Lay jeremycl01 +Jason Grout +Jason King +Jay Bourque +Jean Utke +Jeff VanOss +Jeffrey Yancey <3820914+jeffyancey@users.noreply.github.com> +Jeremy Lay JÊrÊmie du Boisberranger jeremiedbb <34657725+jeremiedbb@users.noreply.github.com> -Jerome Kelleher jeromekelleher -Johannes Hampp euronion <42553970+euronion@users.noreply.github.com> -Johannes SchÃļnberger Johannes SchÃļnberger -John Darbyshire <24256554+attack68@users.noreply.github.com> attack68 <24256554+attack68@users.noreply.github.com> -Joseph Fox-Rabinovitz Joseph Fox-Rabinovitz -Joseph Fox-Rabinovitz Joseph Fox-Rabinovitz -Joseph Fox-Rabinovitz Mad Physicist -Joseph Martinot-Lagarde Joseph Martinot-Lagarde -Julian Taylor Julian Taylor -Julian Taylor Julian Taylor +JÊrome Eertmans +JÊrôme Richard +Jerome Kelleher +JessÊ Pires +Jessi J Zhao <35235453+jessijzhao@users.noreply.github.com> +JoÃŖo Fontes Gonçalves +Johnathon Cusick +Jhong-Ken Chen (険äģ˛č‚¯) +Jhong-Ken Chen (険äģ˛č‚¯) <37182101+kennychenfs@users.noreply.github.com> +Johannes Hampp <42553970+euronion@users.noreply.github.com> +Johannes SchÃļnberger +Johann Faouzi +John Darbyshire <24256554+attack68@users.noreply.github.com> <24256554+attack68@users.noreply.github.com> +John Hagen +John Kirkham +John Kirkham +Johnson Sun <20457146+j3soon@users.noreply.github.com> +Jonas I. Liechti +Jonas I. Liechti +Jonas I. Liechti +Joseph Fox-Rabinovitz +Joseph Fox-Rabinovitz +Joseph Fox-Rabinovitz +Joseph Martinot-Lagarde +Joshua Himmens +Joyce Brum +Jory Klaverstijn +Jory Klaverstijn <63673224+JoryKlaverstijn@users.noreply.github.com> +Julian Taylor +Julian Taylor +Julian Taylor Julien Lhermitte Julien Lhermitte -Julien Schueller jschueller -Kai Striega kai -Kai Striega kai-striega -Kai Striega kai-striega -Khaled Ben Abdallah Okuda KhaledTo +Julien Schueller +Junyan Ou +Justus Magin +Justus Magin +Kai Striega +Kai Striega +Kasia Leszek +Kasia Leszek <39829548+katleszek@users.noreply.github.com> +Karan Dhir +Keller Meier +Kenny Huynh +Kevin Granados +Kevin Granados <54990613+NectDz@users.noreply.github.com> +Kevin Sheppard +Kevin Sheppard +Kerem Hallaç +Khaled Ben Abdallah Okuda Kiko Correoso kikocorreoso Kiko Correoso kikocorreoso -Konrad Kapp k_kapp@yahoo.com -Kriti Singh kritisingh1 -Kmol Yuan Yuan +Konrad Kapp +Kriti Singh +Kmol Yuan +Kumud Lakara <55556183+kumudlakara@users.noreply.github.com> +Lalit Musmade Lars Buitinck Lars Buitinck Lars Buitinck Lars Buitinck -Lars GrÃŧter Lars G -Luis Pedro Coelho Luis Pedro Coelho -Luke Zoltan Kelley lzkelley -Manoj Kumar MechCoder -Mark DePristo markdepristo -Mark Weissman m-d-w -Mark Wiebe Mark -Mark Wiebe Mark Wiebe -Mark Wiebe Mark Wiebe -Mark Wiebe Mark Wiebe -Martin Goodson martingoodson -Martin Teichmann Martin Teichmann -Martino Sorbaro martinosorb -Mattheus Ueckermann empeeu -Matthew Harrigan MattHarrigan -Matti Picus mattip +Lars GrÃŧter +Lars GrÃŧter +Leona Taric +Leona Taric <92495067+LeonaTaric@users.noreply.github.com> +Leonardus Chen +Licht Takeuchi +Lorenzo Mammana +Lillian Zha +Lillian Zha +Lu Yun Chi <32014765+LuYunChi@users.noreply.github.com> +Luis Pedro Coelho +Luke Zoltan Kelley +Madhulika Jain Chambers <53166646+madhulikajc@users.noreply.github.com> +Magdalena Proszewska +Magdalena Proszewska <38814059+mproszewska@users.noreply.github.com> +Malik Idrees Hasan Khan <77000356+MalikIdreesHasanKhan@users.noreply.github.com>C +Manoj Kumar +Marcin Podhajski <36967358+m-podhajski@users.noreply.github.com> +Margret Pax +Margret Pax <13646646+paxcodes@users.noreply.github.com> +Mark DePristo +Mark J. Olson <46202915+molsonkiko@users.noreply.github.com> +Mark Weissman +Mark Wiebe +Mark Wiebe +Mark Wiebe +Mark Wiebe +Mars Lee +Mars Lee <46167686+MarsBarLee@users.noreply.github.com> +Martin Goodson +Martin Reinecke +Martin Teichmann +Mary Conley +Masashi Kishimoto +Matheus Vieira Portela +Matheus Santana Patriarca +Mathieu Lamarre +Matías Ríos +Matt Ord +Matt Ord <55235095+Matt-Ord@users.noreply.github.com> +Matt Hancock +Martino Sorbaro +MÃĄrton GunyhÃŗ +Mattheus Ueckermann +Matthew Barber +Matthew Harrigan +Matthias Bussonnier +Matthieu Darbois +Matti Picus +Matti Picus mattip +Maximilian Konrad +Melissa Weber Mendonça +Melissa Weber Mendonça +Meltem Eren Copur Michael Behrisch behrisch Michael Droettboom mdroe -Michael K. Tran mtran -Michael Martin mmartin -Michael Schnaitter schnaitterm -Muhammad Kasim mfkasim91 -Nathaniel J. Smith njsmith +Michael Dubravski +Michael Dubravski <41096057+mdubravski@users.noreply.github.com> +Michael Felt +Michael Hirsch +Michael K. Tran +Michael Kiffer +Michael Martin +Michael Schnaitter +Michael Siebert +Michael Seifert +Michel Fruchart +Mike Toews +Miki Watanabe (æ¸Ąé‚‰ įžŽå¸Œ) +Miles Cranmer +Mircea Akos Bruma +Mircea Akos Bruma +Mitchell Faas <35742861+Mitchell-Faas@users.noreply.github.com> +Muhammad Kasim +Mukulika Pahari +Mukulika Pahari <60316606+Mukulikaa@users.noreply.github.com> +Munira Alduraibi +Namami Shanker +Namami Shanker NamamiShanker +Nathaniel J. Smith Naveen Arunachalam naveenarun +Neil Girdhar +Nick Papior +Nicola Soranzo Nicolas Scheffer Nicolas Scheffer Nicholas A. Del Grosso nickdg +Nicholas McKibben Nick Minkyu Lee fivemok <9394929+fivemok@users.noreply.github.com> -Ondřej Čertík Ondrej Certik -Óscar Villellas GuillÊn ovillellas +Norwid Behrnd +Norwid Behrnd +Oliver Eberle +Oleksiy Kononenko +Oleksiy Kononenko <35204136+oleksiyskononenko@users.noreply.github.com> +Omar Ali +Omid Rajaei +Omid Rajaei <89868505+rajaeinet@users.noreply.github.com> +Ondřej Čertík +Óscar Villellas GuillÊn +Panos Mavrogiorgos +Pantelis Antonoudiou +Pantelis Antonoudiou Pat Miller patmiller -Paul Ivanov Paul Ivanov -Paul Jacobson hpaulj -Pearu Peterson Pearu Peterson -Pete Peeradej Tanruangporn petetanru -Peter J Cock peterjc +Paul Ivanov +Paul Ivanov +Paul YS Lee Paul +Paul Jacobson +Pey Lian Lim +Pey Lian Lim <2090236+pllim@users.noreply.github.com> +Pearu Peterson +Pete Peeradej Tanruangporn +Peter Bell +Peter J Cock +Peyton Murray Phil Elson -Pierre GM pierregm +Pierre GM Pierre GM pierregm +Piotr Gaiński +Piotr Gaiński Pan Jan Prabhu Ramachandran prabhu -Ralf Gommers Ralf Gommers -Ralf Gommers rgommers -Rehas Sachdeva rehassachdeva -Ritta Narita RittaNarita -Riya Sharma ayir -Robert Kern Robert Kern -Robert LU RobberPhex +Prathmesh Shirsat +Prathmesh Shirsat <55539563+Fayyr@users.noreply.github.com> +Prithvi Singh +Prithvi Singh <42640176+prithvitewatia@users.noreply.github.com> +Przemyslaw Bartosik +Raghuveer Devulapalli +Raghuveer Devulapalli <44766858+r-devulap@users.noreply.github.com> +Rajas Rade lkdmttg7 +Rakesh Vasudevan +Ralf Gommers +Ralf Gommers rgommers +Rehas Sachdeva +Ritta Narita +Riya Sharma +Robert Kern +Robert LU +Robert T. McGibbon +Rohit Goswami +Rohit Goswami +Rohit Goswami +Roland Kaufmann +Roman Yurchak Ronan Lamy Ronan Lamy -Russell Hewett rhewett -Ryan Blakemore ryanblak -Sam Preston jspreston -Sam Radhakrishnan = <=> -Sam Radhakrishnan sam09 -Sanchez Gonzalez Alvaro alvarosg -Saullo Giovani saullogiovani +Roy Jacobson +Russell Hewett +Ryan Blakemore +Ryan Polley +Ryan Soklaski +Ryan Soklaski +Sabrina Simao +Sabrina Simao SabrinaSimao +Sadi Gulcelik +Sadi Gulcelik +Sam Preston +Sam Radhakrishnan = <=> # committed without an email address +Samesh Lakhotia +Samesh Lakhotia <43701530+sameshl@users.noreply.github.com> +Sami Salonen +Sanchez Gonzalez Alvaro +Sanya Sinha <83265366+ssanya942@users.noreply.github.com> +Saransh Chopra +Saullo Giovani Saurabh Mehta -Sebastian Berg seberg -Shekhar Prasad Rajak shekharrajak -Shota Kawabuchi skwbc -Siavash Eliasi siavashserver -Søren Rasmussen sorenrasmussenai <47032123+sorenrasmussenai@users.noreply.github.com> -Stefan van der Walt Stefan van der Walt -Stefan van der Walt Stefan van der Walt -Stephan Hoyer Stephan Hoyer +Sayantika Banik +Schrijvers Luc +Sebastian Berg +Sebastian Schleehauf +Serge Guelton +Sergei Vorfolomeev <39548292+vorfol@users.noreply.github.com> +Shuangchi He +Shubham Gupta +Shubham Gupta <63910248+shubham11941140@users.noreply.github.com> +Shekhar Prasad Rajak +Shen Zhou +Shreya Singh +Shota Kawabuchi +Siavash Eliasi +Simon Altrogge <8720147+SimonAltrogge@users.noreply.github.com> +Simon Conseil +Simon Gasse +Simon Gasse +Sista Seetaram +Sista Seetaram <65669128+sistaseetaram@users.noreply.github.com> +Søren Rasmussen <47032123+sorenrasmussenai@users.noreply.github.com> +Spencer Hill +Srimukh Sripada +Stefan Behnel +Stefan van der Walt +Stefan van der Walt +Stephan Hoyer +Stephan Hoyer +Stephen Worsley <49274989+stephenworsley@users.noreply.github.com> +Steve Stagg Steven J Kern -SuryaChand P Surya P -SuryaChand P psschand -Thomas A Caswell Thomas A Caswell -Tim Cera tim cera -Tim Teichmann tteichmann -Tim Teichmann tteichmann <44259103+tteichmann@users.noreply.github.com> -Tom Boyd pezcore -Tom Poole tpoole -Tony LaTorre tlatorre -Travis Oliphant Travis E. Oliphant -Travis Oliphant Travis Oliphant -Valentin Haenel Valentin Haenel -Vrinda Narayan vrindaaa <48102157+vrindaaa@users.noreply.github.com> -Warren Weckesser Warren Weckesser -Weitang Li wtli@Dirac -Weitang Li wtli -Wendell Smith Wendell Smith -Wim Glenn wim glenn -Wojtek Ruszczewski wrwrwr -Yuji Kanagawa kngwyu -Yury Kirienko kirienko -Zixu Zhao ZZhaoTireless -Ziyan Zhou Ziyan -luzpaz luz.paz -luzpaz luzpaz -spacescientist spacescientist +Stuart Archibald +Stuart Archibald +SuryaChand P +Sylvain Ferriol +Takanori Hirano +Theodoros Nikolaou +Talha Mohsin +Talha Mohsin <131553190+talhabm@users.noreply.github.com> +Thomas A Caswell +Thomas Kluyver +Thomas Orgis +Tim Cera +Tim Teichmann +Tim Teichmann <44259103+tteichmann@users.noreply.github.com> +Tirth Patel +Tobias Pitters +Tobias Pitters <31857876+CloseChoice@users.noreply.github.com> +Tobias Uelwer +Tom Boyd +Tom Poole +Tong Zou +Tony LaTorre +Toshiki Kataoka +Travis Oliphant +Travis Oliphant +Travis Oliphant +Valentin Haenel +Valentin Haenel +Vardhaman Kalloli <83634399+cyai@users.noreply.github.com> +Varun Nayyar +Vinith Kishore +Vinith Kishore <85550536+vinith2@users.noreply.github.com> +Vrinda Narayan +Vrinda Narayan +Vrinda Narayan <48102157+vrindaaa@users.noreply.github.com> +Wansoo Kim +Warren Weckesser +Warren Weckesser +Weitang Li +Wendell Smith +William Spotz +Wim Glenn +Wojtek Ruszczewski +Wojciech Rzadkowski <33913808+wrzadkow@users.noreply.github.com> +Yamada Fuyuka +Yang Hau +Yang Hau +Yashasvi Misra +Yashasvi Misra <54177363+yashasvimisra2798@users.noreply.github.com> +Yogesh Raisinghani <46864533+raisinghanii@users.noreply.github.com> +Younes Sandi +Younes Sandi <65843206+Unessam@users.noreply.github.com> +Yu Feng +Yuji Kanagawa +Yuki K +Yury Kirienko +Zac Hatfield-Dodds +ZÊ Vinícius +Zhang Na +Zixu Zhao +Ziyan Zhou +Zieji Pohz +Zieji Pohz <8103276+zjpoh@users.noreply.github.com> +Zolboo Erdenebaatar +Zolisa Bleki <44142765+zoj613@users.noreply.github.com> diff --git a/.spin/LICENSE b/.spin/LICENSE new file mode 100644 index 000000000000..22ab7d811ffc --- /dev/null +++ b/.spin/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2021--2022, Scientific Python 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 copyright holder 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 HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.spin/cmds.py b/.spin/cmds.py new file mode 100644 index 000000000000..ea44329b1346 --- /dev/null +++ b/.spin/cmds.py @@ -0,0 +1,645 @@ +import os +import shutil +import sys +import argparse +import tempfile +import pathlib +import shutil +import json +import pathlib +import importlib +import subprocess + +import click +from spin import util +from spin.cmds import meson + + +# Check that the meson git submodule is present +curdir = pathlib.Path(__file__).parent +meson_import_dir = curdir.parent / 'vendored-meson' / 'meson' / 'mesonbuild' +if not meson_import_dir.exists(): + raise RuntimeError( + 'The `vendored-meson/meson` git submodule does not exist! ' + + 'Run `git submodule update --init` to fix this problem.' + ) + + +def _get_numpy_tools(filename): + filepath = pathlib.Path('tools', filename) + spec = importlib.util.spec_from_file_location(filename.stem, filepath) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +@click.command() +@click.option( + "-t", "--token", + help="GitHub access token", + required=True +) +@click.option( + "--revision-range", + help="..", + required=True +) +@click.pass_context +def changelog(ctx, token, revision_range): + """👩 Get change log for provided revision range + + \b + Example: + + \b + $ spin authors -t $GH_TOKEN --revision-range v1.25.0..v1.26.0 + """ + try: + from github.GithubException import GithubException + from git.exc import GitError + changelog = _get_numpy_tools(pathlib.Path('changelog.py')) + except ModuleNotFoundError as e: + raise click.ClickException( + f"{e.msg}. Install the missing packages to use this command." + ) + click.secho( + f"Generating change log for range {revision_range}", + bold=True, fg="bright_green", + ) + try: + changelog.main(token, revision_range) + except GithubException as e: + raise click.ClickException( + f"GithubException raised with status: {e.status} " + f"and message: {e.data['message']}" + ) + except GitError as e: + raise click.ClickException( + f"Git error in command `{' '.join(e.command)}` " + f"with error message: {e.stderr}" + ) + + +@click.command() +@click.option( + "-j", "--jobs", + help="Number of parallel tasks to launch", + type=int +) +@click.option( + "--clean", is_flag=True, + help="Clean build directory before build" +) +@click.option( + "-v", "--verbose", is_flag=True, + help="Print all build output, even installation" +) +@click.option( + "--with-scipy-openblas", type=click.Choice(["32", "64"]), + default=None, + help="Build with pre-installed scipy-openblas32 or scipy-openblas64 wheel" +) +@click.argument("meson_args", nargs=-1) +@click.pass_context +def build(ctx, meson_args, with_scipy_openblas, jobs=None, clean=False, verbose=False, quiet=False): + """🔧 Build package with Meson/ninja and install + + MESON_ARGS are passed through e.g.: + + spin build -- -Dpkg_config_path=/lib64/pkgconfig + + The package is installed to build-install + + By default builds for release, to be able to use a debugger set CFLAGS + appropriately. For example, for linux use + + CFLAGS="-O0 -g" spin build + """ + # XXX keep in sync with upstream build + if with_scipy_openblas: + _config_openblas(with_scipy_openblas) + ctx.params.pop("with_scipy_openblas", None) + ctx.forward(meson.build) + + +@click.command() +@click.argument("sphinx_target", default="html") +@click.option( + "--clean", is_flag=True, + default=False, + help="Clean previously built docs before building" +) +@click.option( + "--build/--no-build", + "first_build", + default=True, + help="Build numpy before generating docs", +) +@click.option( + '--jobs', '-j', + metavar='N_JOBS', + default="auto", + help="Number of parallel build jobs" +) +@click.pass_context +def docs(ctx, sphinx_target, clean, first_build, jobs): + """📖 Build Sphinx documentation + + By default, SPHINXOPTS="-W", raising errors on warnings. + To build without raising on warnings: + + SPHINXOPTS="" spin docs + + To list all Sphinx targets: + + spin docs targets + + To build another Sphinx target: + + spin docs TARGET + + E.g., to build a zipfile of the html docs for distribution: + + spin docs dist + + """ + meson.docs.ignore_unknown_options = True + ctx.forward(meson.docs) + + +@click.command() +@click.argument("pytest_args", nargs=-1) +@click.option( + "-m", + "markexpr", + metavar='MARKEXPR', + default="not slow", + help="Run tests with the given markers" +) +@click.option( + "-j", + "n_jobs", + metavar='N_JOBS', + default="1", + help=("Number of parallel jobs for testing. " + "Can be set to `auto` to use all cores.") +) +@click.option( + "--tests", "-t", + metavar='TESTS', + help=(""" +Which tests to run. Can be a module, function, class, or method: + + \b + numpy.random + numpy.random.tests.test_generator_mt19937 + numpy.random.tests.test_generator_mt19937::TestMultivariateHypergeometric + numpy.random.tests.test_generator_mt19937::TestMultivariateHypergeometric::test_edge_cases + \b +""") +) +@click.option( + '--verbose', '-v', is_flag=True, default=False +) +@click.pass_context +def test(ctx, pytest_args, markexpr, n_jobs, tests, verbose): + """🔧 Run tests + + PYTEST_ARGS are passed through directly to pytest, e.g.: + + spin test -- --pdb + + To run tests on a directory or file: + + \b + spin test numpy/linalg + spin test numpy/linalg/tests/test_linalg.py + + To report the durations of the N slowest tests: + + spin test -- --durations=N + + To run tests that match a given pattern: + + \b + spin test -- -k "geometric" + spin test -- -k "geometric and not rgeometric" + + By default, spin will run `-m 'not slow'`. To run the full test suite, use + `spin -m full` + + For more, see `pytest --help`. + """ # noqa: E501 + if (not pytest_args) and (not tests): + pytest_args = ('numpy',) + + if '-m' not in pytest_args: + if markexpr != "full": + pytest_args = ('-m', markexpr) + pytest_args + + if (n_jobs != "1") and ('-n' not in pytest_args): + pytest_args = ('-n', str(n_jobs)) + pytest_args + + if tests and not ('--pyargs' in pytest_args): + pytest_args = ('--pyargs', tests) + pytest_args + + if verbose: + pytest_args = ('-v',) + pytest_args + + ctx.params['pytest_args'] = pytest_args + + for extra_param in ('markexpr', 'n_jobs', 'tests', 'verbose'): + del ctx.params[extra_param] + ctx.forward(meson.test) + + +# From scipy: benchmarks/benchmarks/common.py +def _set_mem_rlimit(max_mem=None): + """ + Set address space rlimit + """ + import resource + import psutil + + mem = psutil.virtual_memory() + + if max_mem is None: + max_mem = int(mem.total * 0.7) + cur_limit = resource.getrlimit(resource.RLIMIT_AS) + if cur_limit[0] > 0: + max_mem = min(max_mem, cur_limit[0]) + + try: + resource.setrlimit(resource.RLIMIT_AS, (max_mem, cur_limit[1])) + except ValueError: + # on macOS may raise: current limit exceeds maximum limit + pass + + +def _commit_to_sha(commit): + p = util.run(['git', 'rev-parse', commit], output=False, echo=False) + if p.returncode != 0: + raise( + click.ClickException( + f'Could not find SHA matching commit `{commit}`' + ) + ) + + return p.stdout.decode('ascii').strip() + + +def _dirty_git_working_dir(): + # Changes to the working directory + p0 = util.run(['git', 'diff-files', '--quiet']) + + # Staged changes + p1 = util.run(['git', 'diff-index', '--quiet', '--cached', 'HEAD']) + + return (p0.returncode != 0 or p1.returncode != 0) + + +def _run_asv(cmd): + # Always use ccache, if installed + PATH = os.environ['PATH'] + EXTRA_PATH = os.pathsep.join([ + '/usr/lib/ccache', '/usr/lib/f90cache', + '/usr/local/lib/ccache', '/usr/local/lib/f90cache' + ]) + env = os.environ + env['PATH'] = f'EXTRA_PATH:{PATH}' + + # Control BLAS/LAPACK threads + env['OPENBLAS_NUM_THREADS'] = '1' + env['MKL_NUM_THREADS'] = '1' + + # Limit memory usage + try: + _set_mem_rlimit() + except (ImportError, RuntimeError): + pass + + util.run(cmd, cwd='benchmarks', env=env) + +@click.command() +@click.option( + "-b", "--branch", + metavar='branch', + default="main", +) +@click.option( + '--uncommitted', + is_flag=True, + default=False, + required=False, +) +@click.pass_context +def lint(ctx, branch, uncommitted): + """đŸ”Ļ Run lint checks on diffs. + Provide target branch name or `uncommitted` to check changes before committing: + + \b + Examples: + + \b + For lint checks of your development brach with `main` or a custom branch: + + \b + $ spin lint # defaults to main + $ spin lint --branch custom_branch + + \b + To check just the uncommitted changes before committing + + \b + $ spin lint --uncommitted + """ + try: + linter = _get_numpy_tools(pathlib.Path('linter.py')) + except ModuleNotFoundError as e: + raise click.ClickException( + f"{e.msg}. Install using linter_requirements.txt" + ) + + linter.DiffLinter(branch).run_lint(uncommitted) + +@click.command() +@click.option( + '--tests', '-t', + default=None, metavar='TESTS', multiple=True, + help="Which tests to run" +) +@click.option( + '--compare', '-c', + is_flag=True, + default=False, + help="Compare benchmarks between the current branch and main " + "(unless other branches specified). " + "The benchmarks are each executed in a new isolated " + "environment." +) +@click.option( + '--verbose', '-v', is_flag=True, default=False +) +@click.option( + '--quick', '-q', is_flag=True, default=False, + help="Run each benchmark only once (timings won't be accurate)" +) +@click.argument( + 'commits', metavar='', + required=False, + nargs=-1 +) +@click.pass_context +def bench(ctx, tests, compare, verbose, quick, commits): + """🏋 Run benchmarks. + + \b + Examples: + + \b + $ spin bench -t bench_lib + $ spin bench -t bench_random.Random + $ spin bench -t Random -t Shuffle + + Two benchmark runs can be compared. + By default, `HEAD` is compared to `main`. + You can also specify the branches/commits to compare: + + \b + $ spin bench --compare + $ spin bench --compare main + $ spin bench --compare main HEAD + + You can also choose which benchmarks to run in comparison mode: + + $ spin bench -t Random --compare + """ + if not commits: + commits = ('main', 'HEAD') + elif len(commits) == 1: + commits = commits + ('HEAD',) + elif len(commits) > 2: + raise click.ClickException( + 'Need a maximum of two revisions to compare' + ) + + bench_args = [] + for t in tests: + bench_args += ['--bench', t] + + if verbose: + bench_args = ['-v'] + bench_args + + if quick: + bench_args = ['--quick'] + bench_args + + if not compare: + # No comparison requested; we build and benchmark the current version + + click.secho( + "Invoking `build` prior to running benchmarks:", + bold=True, fg="bright_green" + ) + ctx.invoke(build) + + meson._set_pythonpath() + + p = util.run( + ['python', '-c', 'import numpy as np; print(np.__version__)'], + cwd='benchmarks', + echo=False, + output=False + ) + os.chdir('..') + + np_ver = p.stdout.strip().decode('ascii') + click.secho( + f'Running benchmarks on NumPy {np_ver}', + bold=True, fg="bright_green" + ) + cmd = [ + 'asv', 'run', '--dry-run', '--show-stderr', '--python=same' + ] + bench_args + _run_asv(cmd) + else: + # Ensure that we don't have uncommited changes + commit_a, commit_b = [_commit_to_sha(c) for c in commits] + + if commit_b == 'HEAD' and _dirty_git_working_dir(): + click.secho( + "WARNING: you have uncommitted changes --- " + "these will NOT be benchmarked!", + fg="red" + ) + + cmd_compare = [ + 'asv', 'continuous', '--factor', '1.05', + ] + bench_args + [commit_a, commit_b] + _run_asv(cmd_compare) + + +@click.command(context_settings={ + 'ignore_unknown_options': True +}) +@click.argument("python_args", metavar='', nargs=-1) +@click.pass_context +def python(ctx, python_args): + """🐍 Launch Python shell with PYTHONPATH set + + OPTIONS are passed through directly to Python, e.g.: + + spin python -c 'import sys; print(sys.path)' + """ + env = os.environ + env['PYTHONWARNINGS'] = env.get('PYTHONWARNINGS', 'all') + ctx.forward(meson.python) + + +@click.command(context_settings={ + 'ignore_unknown_options': True +}) +@click.argument("ipython_args", metavar='', nargs=-1) +@click.pass_context +def ipython(ctx, ipython_args): + """đŸ’ģ Launch IPython shell with PYTHONPATH set + + OPTIONS are passed through directly to IPython, e.g.: + + spin ipython -i myscript.py + """ + env = os.environ + env['PYTHONWARNINGS'] = env.get('PYTHONWARNINGS', 'all') + + ctx.invoke(build) + + ppath = meson._set_pythonpath() + + print(f'đŸ’ģ Launching IPython with PYTHONPATH="{ppath}"') + preimport = (r"import numpy as np; " + r"print(f'\nPreimported NumPy {np.__version__} as np')") + util.run(["ipython", "--ignore-cwd", + f"--TerminalIPythonApp.exec_lines={preimport}"] + + list(ipython_args)) + + +@click.command(context_settings={"ignore_unknown_options": True}) +@click.pass_context +def mypy(ctx): + """đŸĻ† Run Mypy tests for NumPy + """ + env = os.environ + env['NPY_RUN_MYPY_IN_TESTSUITE'] = '1' + ctx.params['pytest_args'] = [os.path.join('numpy', 'typing')] + ctx.params['markexpr'] = 'full' + ctx.forward(test) + +@click.command(context_settings={ + 'ignore_unknown_options': True +}) +@click.option( + "--with-scipy-openblas", type=click.Choice(["32", "64"]), + default=None, required=True, + help="Build with pre-installed scipy-openblas32 or scipy-openblas64 wheel" +) +def config_openblas(with_scipy_openblas): + """🔧 Create .openblas/scipy-openblas.pc file + + Also create _distributor_init_local.py + + Requires a pre-installed scipy-openblas64 or scipy-openblas32 + """ + _config_openblas(with_scipy_openblas) + + +def _config_openblas(blas_variant): + import importlib + basedir = os.getcwd() + openblas_dir = os.path.join(basedir, ".openblas") + pkg_config_fname = os.path.join(openblas_dir, "scipy-openblas.pc") + if blas_variant: + module_name = f"scipy_openblas{blas_variant}" + try: + openblas = importlib.import_module(module_name) + except ModuleNotFoundError: + raise RuntimeError(f"'pip install {module_name} first") + local = os.path.join(basedir, "numpy", "_distributor_init_local.py") + with open(local, "wt", encoding="utf8") as fid: + fid.write(f"import {module_name}\n") + os.makedirs(openblas_dir, exist_ok=True) + with open(pkg_config_fname, "wt", encoding="utf8") as fid: + fid.write(openblas.get_pkg_config().replace("\\", "/")) + + +@click.command() +@click.option( + "-v", "--version-override", + help="NumPy version of release", + required=False +) +@click.pass_context +def notes(ctx, version_override): + """🎉 Generate release notes and validate + + \b + Example: + + \b + $ spin notes --version-override 2.0 + + \b + To automatically pick the version + + \b + $ spin notes + """ + project_config = util.get_config() + version = version_override or project_config['project.version'] + + click.secho( + f"Generating release notes for NumPy {version}", + bold=True, fg="bright_green", + ) + + # Check if `towncrier` is installed + if not shutil.which("towncrier"): + raise click.ClickException( + f"please install `towncrier` to use this command" + ) + + click.secho( + f"Reading upcoming changes from {project_config['tool.towncrier.directory']}", + bold=True, fg="bright_yellow" + ) + # towncrier build --version 2.1 --yes + cmd = ["towncrier", "build", "--version", version, "--yes"] + try: + p = util.run( + cmd=cmd, + sys_exit=False, + output=True, + encoding="utf-8" + ) + except subprocess.SubprocessError as e: + raise click.ClickException( + f"`towncrier` failed returned {e.returncode} with error `{e.stderr}`" + ) + + output_path = project_config['tool.towncrier.filename'].format(version=version) + click.secho( + f"Release notes successfully written to {output_path}", + bold=True, fg="bright_yellow" + ) + + click.secho( + "Verifying consumption of all news fragments", + bold=True, fg="bright_green", + ) + + try: + test_notes = _get_numpy_tools(pathlib.Path('ci', 'test_all_newsfragments_used.py')) + except ModuleNotFoundError as e: + raise click.ClickException( + f"{e.msg}. Install the missing packages to use this command." + ) + + test_notes.main() diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 64b7be051996..000000000000 --- a/.travis.yml +++ /dev/null @@ -1,115 +0,0 @@ -# After changing this file, check it on: -# http://lint.travis-ci.org/ -language: python -group: travis_latest -dist: xenial - -# Travis whitelists the installable packages, additions can be requested -# https://github.com/travis-ci/apt-package-whitelist -addons: - apt: - packages: &common_packages - - gfortran - - libatlas-base-dev - # Speedup builds, particularly when USE_CHROOT=1 - - eatmydata - -cache: - directories: - - $HOME/.cache/pip - -stage: Comprehensive tests - -stages: - # Do the style check and a single test job, don't proceed if it fails - - name: Initial tests - # Do the rest of the tests - - name: Comprehensive tests - -env: - global: - - OpenBLAS_version=0.3.7 - - WHEELHOUSE_UPLOADER_USERNAME=travis.numpy - # The following is generated with the command: - # travis encrypt -r numpy/numpy WHEELHOUSE_UPLOADER_SECRET=tH3AP1KeY - - secure: "IEicLPrP2uW+jW51GRwkONQpdPqMVtQL5bdroqR/U8r9Tr\ - XrbCVRhp4AP8JYZT0ptoBpmZWWGjmKBndB68QlMiUjQPow\ - iFWt9Ka92CaqYdU7nqfWp9VImSndPmssjmCXJ1v1IjZPAM\ - ahp7Qnm0rWRmA0z9SomuRUQOJQ6s684vU=" - -matrix: - include: - # Do all python versions without environment variables set - - stage: Initial tests - python: 3.8 - - - python: 3.5 - - python: 3.6 - - python: 3.7 - - - python: 3.6 - dist: bionic - env: USE_DEBUG=1 - addons: - apt: - packages: - - *common_packages - - cython3-dbg - - python3-dbg - - python3-dev - - python3-setuptools - - - python: 3.7 - env: USE_WHEEL=1 RUN_FULL_TESTS=1 RUN_COVERAGE=1 INSTALL_PICKLE5=1 - - - python: 3.7 - env: USE_SDIST=1 - - - python: 3.7 - env: - - PYTHONOPTIMIZE=2 - - BLAS=None - - LAPACK=None - - ATLAS=None - - NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas - - NPY_LAPACK_ORDER=MKL,OPENBLAS,ATLAS,ACCELERATE,LAPACK - - USE_ASV=1 - - - python: 3.7 - env: NPY_RELAXED_STRIDES_CHECKING=0 - - - python: 3.7 - env: USE_WHEEL=1 NPY_RELAXED_STRIDES_DEBUG=1 - - - python: 3.7 - env: NUMPY_EXPERIMENTAL_ARRAY_FUNCTION=0 - - - python: 3.7 - env: - - BLAS=None - - LAPACK=None - - ATLAS=None - - - python: 3.7 - os: linux - arch: ppc64le - env: - # use ppc64le OpenBLAS build, not system ATLAS - - ATLAS=None - - - python: 3.7 - os: linux - arch: s390x - env: - # use s390x OpenBLAS build, not system ATLAS - - ATLAS=None - - -before_install: - - ./tools/travis-before-install.sh - -script: - - ./tools/travis-test.sh - -after_success: - - ./tools/travis-upload-wheel.sh diff --git a/CITATION.bib b/CITATION.bib new file mode 100644 index 000000000000..66e7dfd372a4 --- /dev/null +++ b/CITATION.bib @@ -0,0 +1,20 @@ +@ARTICLE{2020NumPy-Array, + author = {Harris, Charles R. and Millman, K. Jarrod and + van der Walt, StÊfan J and Gommers, Ralf and + Virtanen, Pauli and Cournapeau, David and + Wieser, Eric and Taylor, Julian and Berg, Sebastian and + Smith, Nathaniel J. and Kern, Robert and Picus, Matti and + Hoyer, Stephan and van Kerkwijk, Marten H. and + Brett, Matthew and Haldane, Allan and + FernÃĄndez del Río, Jaime and Wiebe, Mark and + Peterson, Pearu and GÊrard-Marchant, Pierre and + Sheppard, Kevin and Reddy, Tyler and Weckesser, Warren and + Abbasi, Hameer and Gohlke, Christoph and + Oliphant, Travis E.}, + title = {Array programming with {NumPy}}, + journal = {Nature}, + year = {2020}, + volume = {585}, + pages = {357–362}, + doi = {10.1038/s41586-020-2649-2} +} diff --git a/INSTALL.rst b/INSTALL.rst new file mode 100644 index 000000000000..93c1a15dea66 --- /dev/null +++ b/INSTALL.rst @@ -0,0 +1,157 @@ +Building and installing NumPy ++++++++++++++++++++++++++++++ + +**IMPORTANT**: the below notes are about building NumPy, which for most users +is *not* the recommended way to install NumPy. Instead, use either a complete +scientific Python distribution (recommended) or a binary installer - see +https://scipy.org/install.html. + + +.. Contents:: + +Prerequisites +============= + +Building NumPy requires the following installed software: + +1) Python__ 3.9.x or newer. + + Please note that the Python development headers also need to be installed, + e.g., on Debian/Ubuntu one needs to install both `python3` and + `python3-dev`. On Windows and macOS this is normally not an issue. + +2) Cython >= 0.29.30 but < 3.0 + +3) pytest__ (optional) + + This is required for testing NumPy, but not for using it. + +4) Hypothesis__ (optional) 5.3.0 or later + + This is required for testing NumPy, but not for using it. + +Python__ https://www.python.org/ +pytest__ https://docs.pytest.org/en/stable/ +Hypothesis__ https://hypothesis.readthedocs.io/en/latest/ + + +.. note:: + + If you want to build NumPy in order to work on NumPy itself, use + ``spin``. For more details, see + https://numpy.org/devdocs/dev/development_environment.html + +.. note:: + + More extensive information on building NumPy is maintained at + https://numpy.org/devdocs/user/building.html#building-from-source + + +Basic Installation +================== + +To install NumPy, run:: + + pip install . + +This will compile NumPy on all available CPUs and install it into the active +environment. + +To run the build from the source folder for development purposes, use the +``spin`` development CLI:: + + spin build # installs in-tree under `build-install/` + spin ipython # drop into an interpreter where `import numpy` picks up the local build + +Alternatively, use an editable install with:: + + pip install -e . --no-build-isolation + +See `Requirements for Installing Packages `_ +for more details. + + +Choosing compilers +================== + +NumPy needs C and C++ compilers, and for development versions also needs +Cython. A Fortran compiler isn't needed to build NumPy itself; the +``numpy.f2py`` tests will be skipped when running the test suite if no Fortran +compiler is available. + +For more options including selecting compilers, setting custom compiler flags +and controlling parallelism, see +https://scipy.github.io/devdocs/building/compilers_and_options.html + +Windows +------- + +On Windows, building from source can be difficult (in particular if you need to +build SciPy as well, because that requires a Fortran compiler). Currently, the +most robust option is to use MSVC (for NumPy only). If you also need SciPy, +you can either use MSVC + Intel Fortran or the Intel compiler suite. +Intel itself maintains a good `application note +`_ +on this. + +If you want to use a free compiler toolchain, our current recommendation is to +use Docker or Windows subsystem for Linux (WSL). See +https://scipy.github.io/devdocs/dev/contributor/contributor_toc.html#development-environment +for more details. + + +Building with optimized BLAS support +==================================== + +Configuring which BLAS/LAPACK is used if you have multiple libraries installed +is done via a ``--config-settings`` CLI flag - if not given, the default choice +is OpenBLAS. If your installed library is in a non-standard location, selecting +that location is done via a pkg-config ``.pc`` file. +See http://scipy.github.io/devdocs/building/blas_lapack.html for more details. + +Windows +------- + +The Intel compilers work with Intel MKL, see the application note linked above. + +For an overview of the state of BLAS/LAPACK libraries on Windows, see +`here `_. + +macOS +----- + +On macOS >= 13.3, you can use Apple's Accelerate library. On older macOS versions, +Accelerate has bugs and we recommend using OpenBLAS or (on x86-64) Intel MKL. + +Ubuntu/Debian +------------- + +For best performance, a development package providing BLAS and CBLAS should be +installed. Some of the options available are: + +- ``libblas-dev``: reference BLAS (not very optimized) +- ``libatlas-base-dev``: generic tuned ATLAS, it is recommended to tune it to + the available hardware, see /usr/share/doc/libatlas3-base/README.Debian for + instructions +- ``libopenblas-base``: fast and runtime detected so no tuning required but a + very recent version is needed (>=0.2.15 is recommended). Older versions of + OpenBLAS suffered from correctness issues on some CPUs. + +The package linked to when numpy is loaded can be chosen after installation via +the alternatives mechanism:: + + update-alternatives --config libblas.so.3 + update-alternatives --config liblapack.so.3 + +Or by preloading a specific BLAS library with:: + + LD_PRELOAD=/usr/lib/atlas-base/atlas/libblas.so.3 python ... + + +Build issues +============ + +If you run into build issues and need help, the NumPy and SciPy +`mailing list `_ is the best +place to ask. If the issue is clearly a bug in NumPy, please file an issue (or +even better, a pull request) at https://github.com/numpy/numpy. diff --git a/INSTALL.rst.txt b/INSTALL.rst.txt deleted file mode 100644 index d6c42bad7ea7..000000000000 --- a/INSTALL.rst.txt +++ /dev/null @@ -1,159 +0,0 @@ -Building and installing NumPy -+++++++++++++++++++++++++++++ - -**IMPORTANT**: the below notes are about building NumPy, which for most users -is *not* the recommended way to install NumPy. Instead, use either a complete -scientific Python distribution (recommended) or a binary installer - see -https://scipy.org/install.html. - - -.. Contents:: - -Prerequisites -============= - -Building NumPy requires the following installed software: - -1) For Python 3, Python__ 3.5.x or newer. - - On Debian and derivative (Ubuntu): python python-dev - - On Windows: the official python installer on Python__ is enough - - Make sure that the Python package distutils is installed before - continuing. For example, in Debian GNU/Linux, distutils is included - in the python-dev package. - - Python must also be compiled with the zlib module enabled. - -2) Cython >= 0.29.2 (for development versions of numpy, not for released - versions) - -3) pytest__ (optional) 1.15 or later - - This is required for testing numpy, but not for using it. - -Python__ http://www.python.org -pytest__ http://pytest.readthedocs.io - - -.. note:: - - If you want to build NumPy in order to work on NumPy itself, use - ``runtests.py``. For more details, see - https://docs.scipy.org/doc/numpy/dev/development_environment.html - -.. note:: - - More extensive information on building NumPy (and Scipy) is maintained at - https://scipy.github.io/devdocs/building/ - - -Basic Installation -================== - -To install numpy run:: - - python setup.py build -j 4 install --prefix $HOME/.local - -This will compile numpy on 4 CPUs and install it into the specified prefix. -To perform an inplace build that can be run from the source folder run:: - - python setup.py build_ext --inplace -j 4 - -See `Requirements for Installing Packages `_ -for more details. - -The number of build jobs can also be specified via the environment variable -NPY_NUM_BUILD_JOBS. - - -Choosing compilers -================== - -NumPy needs a C compiler, and for development versions also Cython. A Fortran -compiler isn't needed to build NumPy itself; the ``numpy.f2py`` tests will be -skipped when running the test suite if no Fortran compiler is available. For -building Scipy a Fortran compiler is needed though, so we include some details -on Fortran compilers in the rest of this section. - -On OS X and Linux, all common compilers will work. - -For Fortran, ``gfortran`` works, ``g77`` does not. In case ``g77`` is -installed then ``g77`` will be detected and used first. To explicitly select -``gfortran`` in that case, do:: - - python setup.py build --fcompiler=gnu95 - -Windows -------- - -On Windows, building from source can be difficult. Currently, the most robust -option is to use the Intel compilers, or alternatively MSVC (the same version -as used to build Python itself) with Intel ifort. Intel itself maintains a -good `application note `_ -on this. - -If you want to use a free compiler toolchain, the recommended compiler is MingwPy__. -The older MinGW32 compiler set used to produce older .exe installers for NumPy -itself is still available at https://github.com/numpy/numpy-vendor, but not -recommended for use anymore. - -MingwPy__ https://mingwpy.github.io - - -Building with optimized BLAS support -==================================== - -Configuring which BLAS/LAPACK is used if you have multiple libraries installed, -or you have only one installed but in a non-standard location, is done via a -``site.cfg`` file. See the ``site.cfg.example`` shipped with NumPy for more -details. - -Windows -------- - -The Intel compilers work with Intel MKL, see the application note linked above. -MingwPy__ works with OpenBLAS. -For an overview of the state of BLAS/LAPACK libraries on Windows, see -`here `_. - -OS X ----- - -OS X ships the Accelerate framework, which NumPy can build against without any -manual configuration. Other BLAS/LAPACK implementations (OpenBLAS, Intel MKL, -ATLAS) will also work. - -Ubuntu/Debian -------------- - -For best performance, a development package providing BLAS and CBLAS should be -installed. Some of the options available are: - -- ``libblas-dev``: reference BLAS (not very optimized) -- ``libatlas-base-dev``: generic tuned ATLAS, it is recommended to tune it to - the available hardware, see /usr/share/doc/libatlas3-base/README.Debian for - instructions -- ``libopenblas-base``: fast and runtime detected so no tuning required but a - very recent version is needed (>=0.2.15 is recommended). Older versions of - OpenBLAS suffered from correctness issues on some CPUs. - -The package linked to when numpy is loaded can be chosen after installation via -the alternatives mechanism:: - - update-alternatives --config libblas.so.3 - update-alternatives --config liblapack.so.3 - -Or by preloading a specific BLAS library with:: - - LD_PRELOAD=/usr/lib/atlas-base/atlas/libblas.so.3 python ... - - -Build issues -============ - -If you run into build issues and need help, the NumPy -`mailing list `_ is the best -place to ask. If the issue is clearly a bug in NumPy, please file an issue (or -even better, a pull request) at https://github.com/numpy/numpy. diff --git a/LICENSE.txt b/LICENSE.txt index 5eae3201a70c..014d51c98dfa 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2005-2019, NumPy Developers. +Copyright (c) 2005-2023, NumPy Developers. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/LICENSES_bundled.txt b/LICENSES_bundled.txt index ea349c7ee8de..26faf7ff3021 100644 --- a/LICENSES_bundled.txt +++ b/LICENSES_bundled.txt @@ -1,27 +1,41 @@ The NumPy repository and source distributions bundle several libraries that are compatibly licensed. We list these here. -Name: Numpydoc -Files: doc/sphinxext/numpydoc/* -License: 2-clause BSD - For details, see doc/sphinxext/LICENSE.txt - -Name: scipy-sphinx-theme -Files: doc/scipy-sphinx-theme/* -License: 3-clause BSD, PSF and Apache 2.0 - For details, see doc/scipy-sphinx-theme/LICENSE.txt - Name: lapack-lite Files: numpy/linalg/lapack_lite/* -License: 3-clause BSD +License: BSD-3-Clause For details, see numpy/linalg/lapack_lite/LICENSE.txt Name: tempita Files: tools/npy_tempita/* -License: BSD derived +License: MIT For details, see tools/npy_tempita/license.txt Name: dragon4 Files: numpy/core/src/multiarray/dragon4.c License: MIT For license text, see numpy/core/src/multiarray/dragon4.c + +Name: libdivide +Files: numpy/core/include/numpy/libdivide/* +License: Zlib + For license text, see numpy/core/include/numpy/libdivide/LICENSE.txt + + +Note that the following files are vendored in the repository and sdist but not +installed in built numpy packages: + +Name: Meson +Files: vendored-meson/meson/* +License: Apache 2.0 + For license text, see vendored-meson/meson/COPYING + +Name: meson-python +Files: vendored-meson/meson-python/* +License: MIT + For license text, see vendored-meson/meson-python/LICENSE + +Name: spin +Files: .spin/cmds.py +License: BSD-3 + For license text, see .spin/LICENSE diff --git a/MANIFEST.in b/MANIFEST.in index b58f85d4d295..fc498962a642 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,24 +4,29 @@ # data, etc files to distribution (*for installation*). # Avoid using MANIFEST.in for that. # -include MANIFEST.in -include pyproject.toml -include pytest.ini -include *.txt -include README.md -include site.cfg.example -include runtests.py -include tox.ini +# Files in top-level directory: +include *.* +# Exclude license file that we append to the main license when running +# `python setup.py sdist`. And exclude generated files in repo root. +exclude LICENSES_bundled.txt +exclude .* +exclude azure-*.yml + +# Include coveragerc for runtests.py include .coveragerc -include test_requirements.txt + +# Sub-directories. Included are: numpy/, doc/, benchmarks/, tools/ +include numpy/version.py recursive-include numpy/random *.pyx *.pxd *.pyx.in *.pxd.in +include numpy/py.typed include numpy/random/include/* -include numpy/__init__.pxd +include numpy/*.pxd +# Meson CPU Dispatcher +recursive-include meson_cpu *.build *.in # Add build support that should go in sdist, but not go in bdist/be installed # Note that sub-directories that don't have __init__ are apparently not # included by 'recursive-include', so list those separately recursive-include numpy * -recursive-include numpy/_build_utils * recursive-include numpy/linalg/lapack_lite * recursive-include tools * # Add sdist files whose use depends on local configuration. @@ -45,6 +50,3 @@ prune benchmarks/numpy # Exclude generated files prune */__pycache__ global-exclude *.pyc *.pyo *.pyd *.swp *.bak *~ -# Exclude license file that we append to the main license when running -# `python setup.py sdist` -exclude LICENSES_bundled.txt diff --git a/README.md b/README.md index ae92b6309edd..c0e0b738891a 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,25 @@ -# NumPy +

+ +


-[![Travis](https://img.shields.io/travis/numpy/numpy/master.svg?label=Travis%20CI)]( - https://travis-ci.org/numpy/numpy) -[![Azure](https://dev.azure.com/numpy/numpy/_apis/build/status/azure-pipeline%20numpy.numpy)]( - https://dev.azure.com/numpy/numpy/_build/latest?definitionId=5) -[![codecov](https://codecov.io/gh/numpy/numpy/branch/master/graph/badge.svg)]( - https://codecov.io/gh/numpy/numpy) -NumPy is the fundamental package needed for scientific computing with Python. +[![Powered by NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)]( +https://numfocus.org) +[![PyPI Downloads](https://img.shields.io/pypi/dm/numpy.svg?label=PyPI%20downloads)]( +https://pypi.org/project/numpy/) +[![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/numpy.svg?label=Conda%20downloads)]( +https://anaconda.org/conda-forge/numpy) +[![Stack Overflow](https://img.shields.io/badge/stackoverflow-Ask%20questions-blue.svg)]( +https://stackoverflow.com/questions/tagged/numpy) +[![Nature Paper](https://img.shields.io/badge/DOI-10.1038%2Fs41592--019--0686--2-blue)]( +https://doi.org/10.1038/s41586-020-2649-2) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/numpy/numpy/badge)](https://api.securityscorecards.dev/projects/github.com/numpy/numpy) + + +NumPy is the fundamental package for scientific computing with Python. - **Website:** https://www.numpy.org -- **Documentation:** https://docs.scipy.org/ +- **Documentation:** https://numpy.org/doc - **Mailing list:** https://mail.python.org/mailman/listinfo/numpy-discussion - **Source code:** https://github.com/numpy/numpy - **Contributing:** https://www.numpy.org/devdocs/dev/index.html @@ -26,24 +35,51 @@ It provides: Testing: -- NumPy versions ≥ 1.15 require `pytest` -- NumPy versions < 1.15 require `nose` +NumPy requires `pytest` and `hypothesis`. Tests can then be run after installation with: -Tests can then be run after installation with: + python -c "import numpy, sys; sys.exit(numpy.test() is False)" - python -c 'import numpy; numpy.test()' +Code of Conduct +---------------------- +NumPy is a community-driven open source project developed by a diverse group of +[contributors](https://numpy.org/teams/). The NumPy leadership has made a strong +commitment to creating an open, inclusive, and positive community. Please read the +[NumPy Code of Conduct](https://numpy.org/code-of-conduct/) for guidance on how to interact +with others in a way that makes our community thrive. Call for Contributions ---------------------- -NumPy appreciates help from a wide range of different backgrounds. -Work such as high level documentation or website improvements are valuable -and we would like to grow our team with people filling these roles. -Small improvements or fixes are always appreciated and issues labeled as easy -may be a good starting point. -If you are considering larger contributions outside the traditional coding work, -please contact us through the mailing list. +The NumPy project welcomes your expertise and enthusiasm! + +Small improvements or fixes are always appreciated. 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 +- help us stay on top of new and old issues +- develop tutorials, presentations, and other educational materials +- maintain and improve [our website](https://github.com/numpy/numpy.org) +- develop graphic design for our brand assets and promotional materials +- translate website content +- help with outreach and onboard new contributors +- write grant proposals and help with other fundraising efforts + +For more information about the ways you can contribute to NumPy, visit [our website](https://numpy.org/contribute/). +If you’re unsure where to start or how your skills fit in, reach out! You can +ask on the mailing list or here, on GitHub, by opening a new issue or leaving a +comment on a relevant issue that is already open. + +Our preferred channels of communication are all public, but if you’d like to +speak to us in private first, contact our community coordinators at +numpy-team@googlegroups.com or on Slack (write numpy-team@googlegroups.com for +an invitation). +We also have a biweekly community call, details of which are announced on the +mailing list. You are very welcome to join. -[![Powered by NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](https://numfocus.org) +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. diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9e1e52952d63..ce78d07777fa 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -3,212 +3,112 @@ trigger: batch: False branches: include: - - master + - main - maintenance/* -variables: - # OpenBLAS_version should be updated - # to match numpy-wheels repo - OpenBLAS_version: 0.3.7 + + +pr: + branches: + include: + - '*' # must quote since "*" is a YAML reserved character; we want a string + stages: -- stage: InitialTests + +- stage: Check jobs: - - job: WindowsFast - pool: - vmImage: 'VS2017-Win2016' - strategy: - matrix: - Python36-64bit-fast: - PYTHON_VERSION: '3.6' - PYTHON_ARCH: 'x64' - TEST_MODE: fast - BITS: 64 - steps: - - template: azure-steps-windows.yml + - job: Skip + pool: + vmImage: 'ubuntu-20.04' + variables: + DECODE_PERCENTS: 'false' + RET: 'true' + steps: + - bash: | + git_log=`git log --max-count=1 --skip=1 --pretty=format:"%B" | tr "\n" " "` + echo "##vso[task.setvariable variable=log]$git_log" + - bash: echo "##vso[task.setvariable variable=RET]false" + condition: or(contains(variables.log, '[skip azp]'), contains(variables.log, '[azp skip]'), contains(variables.log, '[skip ci]'), contains(variables.log, '[ci skip]')) + - bash: echo "##vso[task.setvariable variable=start_main;isOutput=true]$RET" + name: result - stage: ComprehensiveTests + condition: and(succeeded(), eq(dependencies.Check.outputs['Skip.result.start_main'], 'true')) + dependsOn: Check jobs: - - job: Linux_Python_36_32bit_full_with_asserts - pool: - vmImage: 'ubuntu-16.04' - steps: - - script: | - docker pull i386/ubuntu:bionic - docker run -v $(pwd):/numpy i386/ubuntu:bionic /bin/bash -c "cd numpy && \ - apt-get -y update && \ - apt-get -y install python3.6-dev python3-pip locales python3-certifi && \ - locale-gen fr_FR && update-locale && \ - apt-get -y install gfortran-5 wget && \ - target=\$(python3 tools/openblas_support.py) && \ - cp -r \$target/usr/local/lib/* /usr/lib && \ - cp \$target/usr/local/include/* /usr/include && \ - python3 -m pip install --user --upgrade pip setuptools && \ - python3 -m pip install --user -r test_requirements.txt && \ - python3 -m pip install . && \ - F77=gfortran-5 F90=gfortran-5 \ - CFLAGS=-UNDEBUG python3 runtests.py -n --debug-info --mode=full -- -rsx --junitxml=junit/test-results.xml && \ - python3 tools/openblas_support.py --check_version $(OpenBLAS_version)" - displayName: 'Run 32-bit Ubuntu Docker Build / Tests' - - task: PublishTestResults@2 - condition: succeededOrFailed() - inputs: - testResultsFiles: '**/test-*.xml' - failTaskOnFailedTests: true - testRunTitle: 'Publish test results for Python 3.6-32 bit full Linux' - - job: macOS + + - job: Lint + condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest')) pool: - # NOTE: at time of writing, there is a danger - # that using an invalid vmIMage string for macOS - # image silently redirects to a Windows build on Azure; - # for now, use the only image name officially present in - # the docs even though i.e., numba uses another in their - # azure config for mac os -- Microsoft has indicated - # they will patch this issue - vmImage: macOS-10.14 + vmImage: 'ubuntu-20.04' steps: - # the @0 refers to the (major) version of the *task* on Microsoft's - # end, not the order in the build matrix nor anything to do - # with version of Python selected - task: UsePythonVersion@0 inputs: - versionSpec: '3.6' + versionSpec: '3.9' addToPath: true architecture: 'x64' - # NOTE: do we have a compelling reason to use older / newer - # versions of Xcode toolchain for testing? - - script: /bin/bash -c "sudo xcode-select -s /Applications/Xcode_10.app/Contents/Developer" - displayName: 'select Xcode version' - # NOTE: might be better if we could avoid installing - # two C compilers, but with homebrew looks like we're - # now stuck getting the full gcc toolchain instead of - # just pulling in gfortran + - script: >- + python -m pip install -r linter_requirements.txt + displayName: 'Install tools' + # pip 21.1 emits a pile of garbage messages to annoy users :) + # failOnStderr: true - script: | - # same version of gfortran as the wheel builds - brew install gcc49 - # manually link critical gfortran libraries - ln -s /usr/local/Cellar/gcc@4.9/4.9.4_1/lib/gcc/4.9/libgfortran.3.dylib /usr/local/lib/libgfortran.3.dylib - ln -s /usr/local/Cellar/gcc@4.9/4.9.4_1/lib/gcc/4.9/libquadmath.0.dylib /usr/local/lib/libquadmath.0.dylib - # manually symlink gfortran-4.9 to plain gfortran - # for f2py - ln -s /usr/local/bin/gfortran-4.9 /usr/local/bin/gfortran - displayName: 'make gfortran available on mac os vm' - # use the pre-built openblas binary that most closely - # matches our MacOS wheel builds -- currently based - # primarily on file size / name details + python tools/linter.py --branch origin/$(System.PullRequest.TargetBranch) + displayName: 'Run Lint Checks' + failOnStderr: true + + - job: Linux_Python_39_32bit_full_with_asserts + pool: + vmImage: 'ubuntu-20.04' + steps: - script: | - target=$(python tools/openblas_support.py) - # manually link to appropriate system paths - cp $target/usr/local/lib/* /usr/local/lib/ - cp $target/usr/local/include/* /usr/local/include/ - displayName: 'install pre-built openblas' - - script: python -m pip install --upgrade pip setuptools wheel - displayName: 'Install tools' + git submodule update --init + displayName: 'Fetch submodules' - script: | - python -m pip install -r test_requirements.txt - python -m pip install vulture docutils sphinx==2.2.0 numpydoc - displayName: 'Install dependencies; some are optional to avoid test skips' - - script: /bin/bash -c "! vulture . --min-confidence 100 --exclude doc/,numpy/distutils/ | grep 'unreachable'" - displayName: 'Check for unreachable code paths in Python modules' - # prefer usage of clang over gcc proper - # to match likely scenario on many user mac machines - - script: python setup.py build -j 4 build_src --verbose-cfg install - displayName: 'Build NumPy' - env: - BLAS: None - LAPACK: None - ATLAS: None - ACCELERATE: None - CC: /usr/bin/clang - # wait until after dev build of NumPy to pip - # install matplotlib to avoid pip install of older numpy - - script: python -m pip install matplotlib - displayName: 'Install matplotlib before refguide run' - - script: python runtests.py -g --refguide-check - displayName: 'Run Refuide Check' - - script: python runtests.py -n --mode=full -- -rsx --junitxml=junit/test-results.xml - displayName: 'Run Full NumPy Test Suite' - - bash: python tools/openblas_support.py --check_version $(OpenBLAS_version) - displayName: 'Verify OpenBLAS version' - - task: PublishTestResults@2 - condition: succeededOrFailed() - inputs: - testResultsFiles: '**/test-*.xml' - failTaskOnFailedTests: true - testRunTitle: 'Publish test results for Python 3.6 64-bit full Mac OS' + # yum does not have a ninja package, so use the PyPI one + docker run -v $(pwd):/numpy -e CFLAGS="-msse2 -std=c99 -UNDEBUG" \ + -e F77=gfortran-5 -e F90=gfortran-5 quay.io/pypa/manylinux2014_i686 \ + /bin/bash -xc " \ + git config --global --add safe.directory /numpy && \ + cd /numpy && \ + /opt/python/cp39-cp39/bin/python -mvenv venv && \ + source venv/bin/activate && \ + target=\$(python3 tools/openblas_support.py) && \ + cp -r \$target/lib/* /usr/lib && \ + cp \$target/include/* /usr/include && \ + python3 -m pip install ninja && \ + python3 -m pip install -r test_requirements.txt && \ + echo CFLAGS \$CFLAGS && \ + python3 -m pip install -v . && \ + cd tools && \ + python3 -m pytest --pyargs numpy" + displayName: 'Run 32-bit manylinux2014 Docker Build / Tests' + - job: Windows pool: - vmImage: 'VS2017-Win2016' + vmImage: 'windows-2019' strategy: - maxParallel: 6 + maxParallel: 3 matrix: - Python36-32bit-fast: - PYTHON_VERSION: '3.6' - PYTHON_ARCH: 'x86' - TEST_MODE: fast - BITS: 32 - Python37-32bit-fast: - PYTHON_VERSION: '3.7' - PYTHON_ARCH: 'x86' - TEST_MODE: fast - BITS: 32 - Python38-32bit-fast: - PYTHON_VERSION: '3.8' - PYTHON_ARCH: 'x86' - TEST_MODE: fast - BITS: 32 - Python35-64bit-full: - PYTHON_VERSION: '3.5' - PYTHON_ARCH: 'x64' - TEST_MODE: full - BITS: 64 - Python36-64bit-full: - PYTHON_VERSION: '3.6' + Python310-64bit-fast: + PYTHON_VERSION: '3.10' PYTHON_ARCH: 'x64' - TEST_MODE: full + TEST_MODE: fast BITS: 64 - Python37-64bit-full: - PYTHON_VERSION: '3.7' + Python311-64bit-full: + PYTHON_VERSION: '3.11' PYTHON_ARCH: 'x64' TEST_MODE: full BITS: 64 - Python38-64bit-full: - PYTHON_VERSION: '3.8' + NPY_USE_BLAS_ILP64: '1' + PyPy39-64bit-fast: + PYTHON_VERSION: 'pypy3.9' PYTHON_ARCH: 'x64' - TEST_MODE: full + TEST_MODE: fast BITS: 64 + NPY_USE_BLAS_ILP64: '1' + # Broken - it builds but _multiarray_umath doesn't import - needs investigating + DISABLE_BLAS: '1' + steps: - template: azure-steps-windows.yml - - job: Linux_PyPy3 - pool: - vmIMage: 'ubuntu-16.04' - steps: - - script: source tools/pypy-test.sh - displayName: 'Run PyPy3 Build / Tests' - - task: PublishTestResults@2 - condition: succeededOrFailed() - inputs: - testResultsFiles: '**/test-*.xml' - testRunTitle: 'Publish test results for PyPy3' - failTaskOnFailedTests: true - - job: Linux_gcc48 - pool: - vmImage: 'ubuntu-18.04' - steps: - - script: | - if ! `gcc-4.8 2>/dev/null`; then - sudo apt install gcc-4.8 - fi - displayName: 'add gcc 4.8' - - script: | - python3 -m pip install --user --upgrade pip setuptools - python3 -m pip install --user -r test_requirements.txt - CPPFLAGS='' CC=gcc-4.8 F77=gfortran-5 F90=gfortran-5 \ - python3 runtests.py --debug-info --mode=full -- -rsx --junitxml=junit/test-results.xml - displayName: 'Run gcc4.8 Build / Tests' - - task: PublishTestResults@2 - condition: succeededOrFailed() - inputs: - testResultsFiles: '**/test-*.xml' - failTaskOnFailedTests: true - testRunTitle: 'Publish test results for gcc 4.8' - diff --git a/azure-steps-windows.yml b/azure-steps-windows.yml index 26d7a667d8cc..1cae980b4368 100644 --- a/azure-steps-windows.yml +++ b/azure-steps-windows.yml @@ -1,56 +1,83 @@ steps: +- script: git submodule update --init + displayName: 'Fetch submodules' - task: UsePythonVersion@0 inputs: versionSpec: $(PYTHON_VERSION) addToPath: true architecture: $(PYTHON_ARCH) -- script: python -m pip install --upgrade pip setuptools wheel + +- script: python -m pip install --upgrade pip wheel displayName: 'Install tools' + - script: python -m pip install -r test_requirements.txt displayName: 'Install dependencies; some are optional to avoid test skips' + - powershell: | - $pyversion = python -c "from __future__ import print_function; import sys; print(sys.version.split()[0])" - Write-Host "Python Version: $pyversion" - $target = "C:\\hostedtoolcache\\windows\\Python\\$pyversion\\$(PYTHON_ARCH)\\lib\\openblas.a" - Write-Host "target path: $target" - $openblas = python tools/openblas_support.py - cp $openblas $target - displayName: 'Download / Install OpenBLAS' + # Note that rtools 42+ does not support 32 bits builds. We dropped testing + # those, but if there's a need to go back on that, use version 4.0.0.20220206 + choco install --confirm --no-progress --allow-downgrade rtools --version=4.3.5550 + choco install unzip -y + choco install -y --checksum 6004DF17818F5A6DBF19CB335CC92702 pkgconfiglite + choco install ninja + echo "##vso[task.setvariable variable=RTOOLS43_HOME]c:\rtools43" + displayName: 'Install utilities' - powershell: | - choco install -y mingw --forcex86 --force --version=5.3.0 - displayName: 'Install 32-bit mingw for 32-bit builds' - condition: eq(variables['BITS'], 32) -# NOTE: for Windows builds it seems much more tractable to use runtests.py -# vs. manual setup.py and then runtests.py for testing only + $ErrorActionPreference = "Stop" + mkdir C:/opt/openblas/openblas_dll + mkdir C:/opt/32/lib/pkgconfig + mkdir C:/opt/64/lib/pkgconfig + $target=$(python -c "import tools.openblas_support as obs; plat=obs.get_plat(); ilp64=obs.get_ilp64(); target=f'openblas_{plat}.zip'; obs.download_openblas(target, plat, ilp64);print(target)") + unzip -o -d c:/opt/ $target + echo "##vso[task.setvariable variable=PKG_CONFIG_PATH]c:/opt/64/lib/pkgconfig" + copy C:/opt/64/bin/*.dll C:/opt/openblas/openblas_dll + displayName: 'Download / Install OpenBLAS' + - powershell: | - If ($(BITS) -eq 32) { - $env:CFLAGS = "-m32" - $env:LDFLAGS = "-m32" - $env:PATH = "C:\\tools\\mingw32\\bin;" + $env:PATH - refreshenv - } + # Note: ensure the `pip install .` command remains the last one here, to + # avoid "green on failure" issues python -c "from tools import openblas_support; openblas_support.make_init('numpy')" - pip wheel -v -v -v --wheel-dir=dist . - - ls dist -r | Foreach-Object { - pip install $_.FullName + If ( Test-Path env:DISABLE_BLAS ) { + python -m pip install . -v -Csetup-args="--vsenv" -Csetup-args="-Dblas=none" -Csetup-args="-Dlapack=none" -Csetup-args="-Dallow-noblas=true" + } + elseif ( Test-Path env:NPY_USE_BLAS_ILP64 ) { + python -m pip install scipy-openblas64 spin + spin config-openblas --with-scipy-openblas=64 + $env:PKG_CONFIG_PATH="$pwd/.openblas" + python -m pip install . -v -Csetup-args="--vsenv" -Csetup-args="-Duse-ilp64=true" + } else { + python -m pip install . -v -Csetup-args="--vsenv" } displayName: 'Build NumPy' -- bash: | - pushd . && cd .. && target=$(python -c "import numpy, os; print(os.path.abspath(os.path.join(os.path.dirname(numpy.__file__), '.libs')))") && popd - pip download -d destination --only-binary --no-deps numpy==1.14 - cd destination && unzip numpy*.whl && cp numpy/.libs/*.dll $target - ls $target - displayName: 'Add extraneous & older DLL to numpy/.libs to probe DLL handling robustness' - condition: eq(variables['PYTHON_VERSION'], '3.6') -- script: pushd . && cd .. && python -c "from ctypes import windll; windll.kernel32.SetDefaultDllDirectories(0x00000800); import numpy" && popd - displayName: 'For gh-12667; Windows DLL resolution' -- script: python runtests.py -n --show-build-log --mode=$(TEST_MODE) -- -rsx --junitxml=junit/test-results.xml + +- powershell: | + # copy from c:/opt/openblas/openblas_dll to numpy/../numpy.libs to ensure it can + # get loaded when numpy is imported (no RPATH on Windows) + $target = $(python -c "import sysconfig; print(sysconfig.get_path('platlib'))") + mkdir $target/numpy.libs + copy C:/opt/openblas/openblas_dll/*.dll $target/numpy.libs + displayName: 'Copy OpenBLAS DLL to site-packages' + +- script: | + python -m pip install threadpoolctl + python tools/openblas_support.py --check_version + displayName: 'Check OpenBLAS version' + +- powershell: | + cd tools # avoid root dir to not pick up source tree + # Get a gfortran onto the path for f2py tests + $env:PATH = "$env:RTOOLS43_HOME\\x86_64-w64-mingw32.static.posix\\bin;$env:PATH" + If ( $env:TEST_MODE -eq "full" ) { + pytest --pyargs numpy -rsx --junitxml=junit/test-results.xml + } else { + pytest --pyargs numpy -m "not slow" -rsx --junitxml=junit/test-results.xml + } displayName: 'Run NumPy Test Suite' + - task: PublishTestResults@2 condition: succeededOrFailed() inputs: testResultsFiles: '**/test-*.xml' failTaskOnFailedTests: true - testRunTitle: 'Publish test results for Python $(PYTHON_VERSION) $(BITS)-bit $(TEST_MODE) Windows' \ No newline at end of file + testRunTitle: 'Publish test results for Python $(PYTHON_VERSION) $(BITS)-bit $(TEST_MODE) Windows' diff --git a/benchmarks/README.rst b/benchmarks/README.rst index b67994ce08e6..e44f8fe02f1e 100644 --- a/benchmarks/README.rst +++ b/benchmarks/README.rst @@ -11,24 +11,63 @@ Usage ----- Airspeed Velocity manages building and Python virtualenvs by itself, -unless told otherwise. Some of the benchmarking features in -``runtests.py`` also tell ASV to use the NumPy compiled by -``runtests.py``. To run the benchmarks, you do not need to install a +unless told otherwise. To run the benchmarks, you do not need to install a development version of NumPy to your current Python environment. -Run a benchmark against currently checked out NumPy version (don't -record the result):: +Before beginning, ensure that *airspeed velocity* is installed. +By default, `asv` ships with support for anaconda and virtualenv:: - python runtests.py --bench bench_core + pip install asv + pip install virtualenv -Compare change in benchmark results to another version:: +After contributing new benchmarks, you should test them locally before +submitting a pull request. - python runtests.py --bench-compare v1.6.2 bench_core +To run all benchmarks, navigate to the root NumPy directory at +the command line and execute:: -Run ASV commands (record results and generate HTML):: + spin bench + +This builds NumPy and runs all available benchmarks +defined in ``benchmarks/``. (Note: this could take a while. Each +benchmark is run multiple times to measure the distribution in +execution times.) + +For **testing** benchmarks locally, it may be better to run these without +replications:: + + cd benchmarks/ + export REGEXP="bench.*Ufunc" + asv run --dry-run --show-stderr --python=same --quick -b $REGEXP + +Where the regular expression used to match benchmarks is stored in ``$REGEXP``, +and `--quick` is used to avoid repetitions. + +To run benchmarks from a particular benchmark module, such as +``bench_core.py``, simply append the filename without the extension:: + + spin bench -t bench_core + +To run a benchmark defined in a class, such as ``MeshGrid`` +from ``bench_creation.py``:: + + spin bench -t bench_creation.MeshGrid + +Compare changes in benchmark results to another version/commit/branch, use the +``--compare`` option (or the equivalent ``-c``):: + + spin bench --compare v1.6.2 -t bench_core + spin bench --compare 20d03bcfd -t bench_core + spin bench -c main -t bench_core + +All of the commands above display the results in plain text in +the console, and the results are not saved for comparison with +future commits. For greater control, a graphical view, and to +have results saved for future comparison you can run ASV commands +(record results and generate HTML):: cd benchmarks - asv run --skip-existing-commits --steps 10 ALL + asv run -n -e --python=same asv publish asv preview @@ -38,6 +77,27 @@ Command-line help is available as usual via ``asv --help`` and .. _ASV documentation: https://asv.readthedocs.io/ +Benchmarking versions +--------------------- + +To benchmark or visualize only releases on different machines locally, the tags with their commits can be generated, before being run with ``asv``, that is:: + + cd benchmarks + # Get commits for tags + # delete tag_commits.txt before re-runs + for gtag in $(git tag --list --sort taggerdate | grep "^v"); do + git log $gtag --oneline -n1 --decorate=no | awk '{print $1;}' >> tag_commits.txt + done + # Use the last 20 + tail --lines=20 tag_commits.txt > 20_vers.txt + asv run HASHFILE:20_vers.txt + # Publish and view + asv publish + asv preview + +For details on contributing these, see the `benchmark results repository`_. + +.. _benchmark results repository: https://github.com/HaoZeke/asv-numpy Writing benchmarks ------------------ diff --git a/benchmarks/asv.conf.json b/benchmarks/asv.conf.json index b3c7f9f20e6a..267450448b61 100644 --- a/benchmarks/asv.conf.json +++ b/benchmarks/asv.conf.json @@ -15,7 +15,7 @@ // List of branches to benchmark. If not provided, defaults to "master" // (for git) or "tip" (for mercurial). - "branches": ["master"], + "branches": ["HEAD"], // The DVCS being used. If not set, it will be automatically // determined from "repo" by looking at the protocol in the URL @@ -35,15 +35,16 @@ // 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 // list indicates to just test against the default (latest) // version. "matrix": { - "six": [], "Cython": [], + "setuptools": ["59.2.0"], + "packaging": [] }, // The directory (relative to the current directory) that benchmarks are diff --git a/benchmarks/asv_compare.conf.json.tpl b/benchmarks/asv_compare.conf.json.tpl new file mode 100644 index 000000000000..f0ef0bf49185 --- /dev/null +++ b/benchmarks/asv_compare.conf.json.tpl @@ -0,0 +1,99 @@ +// This config file is almost similar to 'asv.conf.json' except it contains +// custom tokens that can be substituted by 'runtests.py' and ASV, +// due to the necessity to add custom build options when `--bench-compare` +// is used. +{ + // The version of the config file format. Do not change, unless + // you know what you are doing. + "version": 1, + + // The name of the project being benchmarked + "project": "numpy", + + // The project's homepage + "project_url": "https://www.numpy.org/", + + // The URL or local path of the source code repository for the + // project being benchmarked + "repo": "..", + + // List of branches to benchmark. If not provided, defaults to "master" + // (for git) or "tip" (for mercurial). + "branches": ["HEAD"], + + // The DVCS being used. If not set, it will be automatically + // determined from "repo" by looking at the protocol in the URL + // (if remote), or by looking for special directories, such as + // ".git" (if local). + "dvcs": "git", + + // The tool to use to create environments. May be "conda", + // "virtualenv" or other value depending on the plugins in use. + // If missing or the empty string, the tool will be automatically + // determined by looking for tools on the PATH environment + // variable. + "environment_type": "virtualenv", + + // the base URL to show a commit for the project. + "show_commit_url": "https://github.com/numpy/numpy/commit/", + + // The Pythons you'd like to test against. If not provided, defaults + // to the current version of Python used to run `asv`. + // "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 + // list indicates to just test against the default (latest) + // version. + "matrix": { + "Cython": [], + "setuptools": ["59.2.0"], + "packaging": [] + }, + + // The directory (relative to the current directory) that benchmarks are + // stored in. If not provided, defaults to "benchmarks" + "benchmark_dir": "benchmarks", + + // The directory (relative to the current directory) to cache the Python + // environments in. If not provided, defaults to "env" + // NOTE: changes dir name will requires update `generate_asv_config()` in + // runtests.py + "env_dir": "env", + + + // The directory (relative to the current directory) that raw benchmark + // results are stored in. If not provided, defaults to "results". + "results_dir": "results", + + // The directory (relative to the current directory) that the html tree + // should be written to. If not provided, defaults to "html". + "html_dir": "html", + + // The number of characters to retain in the commit hashes. + // "hash_length": 8, + + // `asv` will cache wheels of the recent builds in each + // environment, making them faster to install next time. This is + // number of builds to keep, per environment. + "build_cache_size": 8, + + "build_command" : [ + "python setup.py build {numpy_build_options}", + // pip ignores '--global-option' when pep517 is enabled, we also enabling pip verbose to + // be reached from asv `--verbose` so we can verify the build options. + "PIP_NO_BUILD_ISOLATION=false python {build_dir}/benchmarks/asv_pip_nopep517.py -v {numpy_global_options} --no-deps --no-index -w {build_cache_dir} {build_dir}" + ], + // The commits after which the regression search in `asv publish` + // should start looking for regressions. Dictionary whose keys are + // regexps matching to benchmark names, and values corresponding to + // the commit (exclusive) after which to start looking for + // regressions. The default is to start from the first commit + // with results. If the commit is `null`, regression detection is + // skipped for the matching benchmark. + // + // "regressions_first_commits": { + // "some_benchmark": "352cdf", // Consider regressions only after this commit + // "another_benchmark": null, // Skip regression detection altogether + // } +} diff --git a/benchmarks/asv_pip_nopep517.py b/benchmarks/asv_pip_nopep517.py new file mode 100644 index 000000000000..085cbff1f4ee --- /dev/null +++ b/benchmarks/asv_pip_nopep517.py @@ -0,0 +1,15 @@ +""" +This file is used by asv_compare.conf.json.tpl. +""" +import subprocess, sys +# pip ignores '--global-option' when pep517 is enabled therefore we disable it. +cmd = [sys.executable, '-mpip', 'wheel', '--no-use-pep517'] +try: + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, text=True) +except Exception as e: + output = str(e.output) +if "no such option" in output: + print("old version of pip, escape '--no-use-pep517'") + cmd.pop() + +subprocess.run(cmd + sys.argv[1:]) diff --git a/benchmarks/benchmarks/__init__.py b/benchmarks/benchmarks/__init__.py index e8a859ff4784..35fc87eac0a9 100644 --- a/benchmarks/benchmarks/__init__.py +++ b/benchmarks/benchmarks/__init__.py @@ -1,3 +1,53 @@ -from __future__ import absolute_import, division, print_function - from . import common +import sys +import os + +def show_cpu_features(): + from numpy.lib.utils import _opt_info + info = _opt_info() + info = "NumPy CPU features: " + (info if info else 'nothing enabled') + # ASV wrapping stdout & stderr, so we assume having a tty here + if 'SHELL' in os.environ and sys.platform != 'win32': + # to avoid the red color that imposed by ASV + print(f"\033[33m{info}\033[0m") + else: + print(info) + +def dirty_lock(lock_name, lock_on_count=1): + # this lock occurred before each round to avoid duplicate printing + if not hasattr(os, "getppid"): + return False + ppid = os.getppid() + if not ppid or ppid == os.getpid(): + # not sure if this gonna happen, but ASV run each round in + # a separate process so the lock should be based on the parent + # process id only + return False + lock_path = os.path.abspath(os.path.join( + os.path.dirname(__file__), "..", "env", lock_name) + ) + # ASV loads the 'benchmark_dir' to discover the available benchmarks + # the issue here is ASV doesn't capture any strings from stdout or stderr + # during this stage so we escape it and lock on the second increment + try: + with open(lock_path, 'a+') as f: + f.seek(0) + count, _ppid = (f.read().split() + [0, 0])[:2] + count, _ppid = int(count), int(_ppid) + if _ppid == ppid: + if count >= lock_on_count: + return True + count += 1 + else: + count = 0 + f.seek(0) + f.truncate() + f.write(f"{str(count)} {str(ppid)}") + except IOError: + pass + return False + + +# FIXME: there's no official way to provide extra information to the test log +if not dirty_lock("print_cpu_features.lock"): + show_cpu_features() diff --git a/benchmarks/benchmarks/bench_app.py b/benchmarks/benchmarks/bench_app.py index ccf6e4c4af85..d22aa2e09604 100644 --- a/benchmarks/benchmarks/bench_app.py +++ b/benchmarks/benchmarks/bench_app.py @@ -1,11 +1,7 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark import numpy as np -from six.moves import xrange - class LaplaceInplace(Benchmark): params = ['inplace', 'normal'] @@ -61,7 +57,7 @@ def setup(self): ntime = 200 self.arrays = [np.random.normal(size=(ntime, nfeat)) - for i in xrange(nsubj)] + for i in range(nsubj)] def maxes_of_dots(self, arrays): """ @@ -74,8 +70,8 @@ def maxes_of_dots(self, arrays): Arrays must agree only on the first dimension. - For numpy it a join benchmark of dot products and max() - on a set of arrays. + Numpy uses this as a simultaneous benchmark of 1) dot products + and 2) max(, axis=). """ feature_scores = ([0] * len(arrays)) for (i, sd) in enumerate(arrays): diff --git a/benchmarks/benchmarks/bench_array_coercion.py b/benchmarks/benchmarks/bench_array_coercion.py new file mode 100644 index 000000000000..17629fe7f92f --- /dev/null +++ b/benchmarks/benchmarks/bench_array_coercion.py @@ -0,0 +1,55 @@ +from .common import Benchmark + +import numpy as np + + +class ArrayCoercionSmall(Benchmark): + # More detailed benchmarks for array coercion, + # some basic benchmarks are in `bench_core.py`. + params = [[range(3), [1], 1, np.array([5], dtype=np.int64), np.int64(5)]] + param_names = ['array_like'] + int64 = np.dtype(np.int64) + + def time_array_invalid_kwarg(self, array_like): + try: + np.array(array_like, ndmin="not-integer") + except TypeError: + pass + + def time_array(self, array_like): + np.array(array_like) + + def time_array_dtype_not_kwargs(self, array_like): + np.array(array_like, self.int64) + + def time_array_no_copy(self, array_like): + np.array(array_like, copy=False) + + def time_array_subok(self, array_like): + np.array(array_like, subok=True) + + def time_array_all_kwargs(self, array_like): + np.array(array_like, dtype=self.int64, copy=False, order="F", + subok=False, ndmin=2) + + def time_asarray(self, array_like): + np.asarray(array_like) + + def time_asarray_dtype(self, array_like): + np.array(array_like, dtype=self.int64) + + def time_asarray_dtype(self, array_like): + np.array(array_like, dtype=self.int64, order="F") + + def time_asanyarray(self, array_like): + np.asarray(array_like) + + def time_asanyarray_dtype(self, array_like): + np.array(array_like, dtype=self.int64) + + def time_asanyarray_dtype(self, array_like): + np.array(array_like, dtype=self.int64, order="F") + + def time_ascontiguousarray(self, array_like): + np.ascontiguousarray(array_like) + diff --git a/benchmarks/benchmarks/bench_avx.py b/benchmarks/benchmarks/bench_avx.py deleted file mode 100644 index f7b524e43ba0..000000000000 --- a/benchmarks/benchmarks/bench_avx.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import absolute_import, division, print_function - -from .common import Benchmark - -import numpy as np - -avx_ufuncs = ['sqrt', - 'absolute', - 'reciprocal', - 'square', - 'rint', - 'floor', - 'ceil' , - 'trunc'] -stride = [1, 2, 4] -dtype = ['f', 'd'] - -class AVX_UFunc(Benchmark): - params = [avx_ufuncs, stride, dtype] - param_names = ['avx_based_ufunc', 'stride', 'dtype'] - timeout = 10 - - def setup(self, ufuncname, stride, dtype): - np.seterr(all='ignore') - try: - self.f = getattr(np, ufuncname) - except AttributeError: - raise NotImplementedError() - N = 10000 - self.arr = np.ones(stride*N, dtype) - - def time_ufunc(self, ufuncname, stride, dtype): - self.f(self.arr[::stride]) - diff --git a/benchmarks/benchmarks/bench_core.py b/benchmarks/benchmarks/bench_core.py index f7ce61b8f9ca..fe1cd37b6fdf 100644 --- a/benchmarks/benchmarks/bench_core.py +++ b/benchmarks/benchmarks/bench_core.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark import numpy as np @@ -9,9 +7,13 @@ class Core(Benchmark): def setup(self): self.l100 = range(100) self.l50 = range(50) + self.float_l1000 = [float(i) for i in range(1000)] + self.float64_l1000 = [np.float64(i) for i in range(1000)] + self.int_l1000 = list(range(1000)) self.l = [np.arange(1000), np.arange(1000)] self.l_view = [memoryview(a) for a in self.l] self.l10x10 = np.ones((10, 10)) + self.float64_dtype = np.dtype(np.float64) def time_array_1(self): np.array(1) @@ -25,12 +27,30 @@ def time_array_l1(self): def time_array_l100(self): np.array(self.l100) + def time_array_float_l1000(self): + np.array(self.float_l1000) + + def time_array_float_l1000_dtype(self): + np.array(self.float_l1000, dtype=self.float64_dtype) + + def time_array_float64_l1000(self): + np.array(self.float64_l1000) + + def time_array_int_l1000(self): + np.array(self.int_l1000) + def time_array_l(self): np.array(self.l) def time_array_l_view(self): np.array(self.l_view) + def time_can_cast(self): + np.can_cast(self.l10x10, self.float64_dtype) + + def time_can_cast_same_kind(self): + np.can_cast(self.l10x10, self.float64_dtype, casting="same_kind") + def time_vstack_l(self): np.vstack(self.l) @@ -52,6 +72,9 @@ def time_ones_100(self): def time_empty_100(self): np.empty(100) + def time_empty_like(self): + np.empty_like(self.l10x10) + def time_eye_100(self): np.eye(100) @@ -79,6 +102,12 @@ def time_triu_l10x10(self): def time_tril_l10x10(self): np.tril(self.l10x10) + def time_triu_indices_500(self): + np.triu_indices(500) + + def time_tril_indices_500(self): + np.tril_indices(500) + class Temporaries(Benchmark): def setup(self): @@ -122,7 +151,7 @@ class CountNonzero(Benchmark): params = [ [1, 2, 3], [100, 10000, 1000000], - [bool, int, str, object] + [bool, np.int8, np.int16, np.int32, np.int64, str, object] ] def setup(self, numaxes, size, dtype): @@ -151,6 +180,9 @@ def setup(self, dtype): def time_packbits(self, dtype): np.packbits(self.d) + def time_packbits_little(self, dtype): + np.packbits(self.d, bitorder="little") + def time_packbits_axis0(self, dtype): np.packbits(self.d2, axis=0) @@ -182,3 +214,42 @@ def time_unpackbits_axis1_little(self): class Indices(Benchmark): def time_indices(self): np.indices((1000, 500)) + + +class StatsMethods(Benchmark): + # Not testing, but in array_api (redundant) + # 8, 16, 32 bit variants, and 128 complexes + params = [['int64', 'uint64', 'float64', 'intp', + 'complex64', 'bool', 'float', 'int', + 'complex', 'complex256'], + [100**n for n in range(0, 2)]] + param_names = ['dtype', 'size'] + + def setup(self, dtype, size): + try: + self.data = np.ones(size, dtype=getattr(np, dtype)) + except AttributeError: # builtins throw AttributeError after 1.20 + self.data = np.ones(size, dtype=dtype) + if dtype.startswith('complex'): + self.data = np.random.randn(size) + 1j * np.random.randn(size) + + def time_min(self, dtype, size): + self.data.min() + + def time_max(self, dtype, size): + self.data.max() + + def time_mean(self, dtype, size): + self.data.mean() + + def time_std(self, dtype, size): + self.data.std() + + def time_prod(self, dtype, size): + self.data.prod() + + def time_var(self, dtype, size): + self.data.var() + + def time_sum(self, dtype, size): + self.data.sum() diff --git a/benchmarks/benchmarks/bench_creation.py b/benchmarks/benchmarks/bench_creation.py new file mode 100644 index 000000000000..3a577df7a1fc --- /dev/null +++ b/benchmarks/benchmarks/bench_creation.py @@ -0,0 +1,81 @@ +from .common import Benchmark, TYPES1 + +import numpy as np + + +class MeshGrid(Benchmark): + """ Benchmark meshgrid generation + """ + params = [[16, 32], + [2, 3, 4], + ['ij', 'xy'], TYPES1] + param_names = ['size', 'ndims', 'ind', 'ndtype'] + timeout = 10 + + def setup(self, size, ndims, ind, ndtype): + self.grid_dims = [(np.random.ranf(size)).astype(ndtype) for + x in range(ndims)] + + def time_meshgrid(self, size, ndims, ind, ndtype): + np.meshgrid(*self.grid_dims, indexing=ind) + + +class Create(Benchmark): + """ Benchmark for creation functions + """ + # (64, 64), (128, 128), (256, 256) + # , (512, 512), (1024, 1024) + params = [[16, 32, 128, 256, 512, + (16, 16), (32, 32)], + ['C', 'F'], + TYPES1] + param_names = ['shape', 'order', 'npdtypes'] + timeout = 10 + + def setup(self, shape, order, npdtypes): + values = get_squares_() + self.xarg = values.get(npdtypes)[0] + + def time_full(self, shape, order, npdtypes): + np.full(shape, self.xarg[1], dtype=npdtypes, order=order) + + def time_full_like(self, shape, order, npdtypes): + np.full_like(self.xarg, self.xarg[0], order=order) + + def time_ones(self, shape, order, npdtypes): + np.ones(shape, dtype=npdtypes, order=order) + + def time_ones_like(self, shape, order, npdtypes): + np.ones_like(self.xarg, order=order) + + def time_zeros(self, shape, order, npdtypes): + np.zeros(shape, dtype=npdtypes, order=order) + + def time_zeros_like(self, shape, order, npdtypes): + np.zeros_like(self.xarg, order=order) + + def time_empty(self, shape, order, npdtypes): + np.empty(shape, dtype=npdtypes, order=order) + + def time_empty_like(self, shape, order, npdtypes): + np.empty_like(self.xarg, order=order) + + +class UfuncsFromDLP(Benchmark): + """ Benchmark for creation functions + """ + params = [[16, 32, (16, 16), + (32, 32), (64, 64)], + TYPES1] + param_names = ['shape', 'npdtypes'] + timeout = 10 + + def setup(self, shape, npdtypes): + if npdtypes in ['longdouble', 'clongdouble']: + raise NotImplementedError( + 'Only IEEE dtypes are supported') + values = get_squares_() + self.xarg = values.get(npdtypes)[0] + + def time_from_dlpack(self, shape, npdtypes): + np.from_dlpack(self.xarg) diff --git a/benchmarks/benchmarks/bench_function_base.py b/benchmarks/benchmarks/bench_function_base.py index 2170c4fc4cd5..1655868b3b55 100644 --- a/benchmarks/benchmarks/bench_function_base.py +++ b/benchmarks/benchmarks/bench_function_base.py @@ -1,9 +1,16 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark import numpy as np +class Linspace(Benchmark): + def setup(self): + self.d = np.array([1, 2, 3]) + + def time_linspace_scalar(self): + np.linspace(0, 10, 2) + + def time_linspace_array(self): + np.linspace(self.d, 10, 10) class Histogram1D(Benchmark): def setup(self): @@ -45,10 +52,26 @@ def time_weights(self): np.bincount(self.d, weights=self.e) +class Mean(Benchmark): + param_names = ['size'] + params = [[1, 10, 100_000]] + + def setup(self, size): + self.array = np.arange(2*size).reshape(2, size) + + def time_mean(self, size): + np.mean(self.array) + + def time_mean_axis(self, size): + np.mean(self.array, axis=1) + + class Median(Benchmark): def setup(self): self.e = np.arange(10000, dtype=np.float32) self.o = np.arange(10001, dtype=np.float32) + self.tall = np.random.random((10000, 20)) + self.wide = np.random.random((20, 10000)) def time_even(self): np.median(self.e) @@ -68,11 +91,17 @@ def time_even_small(self): def time_odd_small(self): np.median(self.o[:500], overwrite_input=True) + def time_tall(self): + np.median(self.tall, axis=-1) + + def time_wide(self): + np.median(self.wide, axis=0) + class Percentile(Benchmark): def setup(self): self.e = np.arange(10000, dtype=np.float32) - self.o = np.arange(10001, dtype=np.float32) + self.o = np.arange(21, dtype=np.float32) def time_quartile(self): np.percentile(self.e, [25, 75]) @@ -80,6 +109,9 @@ def time_quartile(self): def time_percentile(self): np.percentile(self.e, [25, 35, 55, 65, 75]) + def time_percentile_small(self): + np.percentile(self.o, [25, 75]) + class Select(Benchmark): def setup(self): @@ -106,7 +138,7 @@ def wrapped(*args): return f -class SortGenerator(object): +class SortGenerator: # The size of the unsorted area in the "random unsorted area" # benchmarks AREA_SIZE = 100 @@ -216,7 +248,7 @@ class Sort(Benchmark): # In NumPy 1.17 and newer, 'merge' can be one of several # stable sorts, it isn't necessarily merge sort. ['quick', 'merge', 'heap'], - ['float64', 'int64', 'int16'], + ['float64', 'int64', 'float32', 'uint32', 'int32', 'int16', 'float16'], [ ('random',), ('ordered',), @@ -276,8 +308,25 @@ def time_sort_worst(self): class Where(Benchmark): def setup(self): self.d = np.arange(20000) + self.d_o = self.d.astype(object) self.e = self.d.copy() + self.e_o = self.d_o.copy() self.cond = (self.d > 5000) + size = 1024 * 1024 // 8 + rnd_array = np.random.rand(size) + self.rand_cond_01 = rnd_array > 0.01 + self.rand_cond_20 = rnd_array > 0.20 + self.rand_cond_30 = rnd_array > 0.30 + self.rand_cond_40 = rnd_array > 0.40 + self.rand_cond_50 = rnd_array > 0.50 + self.all_zeros = np.zeros(size, dtype=bool) + self.all_ones = np.ones(size, dtype=bool) + self.rep_zeros_2 = np.arange(size) % 2 == 0 + self.rep_zeros_4 = np.arange(size) % 4 == 0 + self.rep_zeros_8 = np.arange(size) % 8 == 0 + self.rep_ones_2 = np.arange(size) % 2 > 0 + self.rep_ones_4 = np.arange(size) % 4 > 0 + self.rep_ones_8 = np.arange(size) % 8 > 0 def time_1(self): np.where(self.cond) @@ -285,5 +334,50 @@ def time_1(self): def time_2(self): np.where(self.cond, self.d, self.e) + def time_2_object(self): + # object and byteswapped arrays have a + # special slow path in the where internals + np.where(self.cond, self.d_o, self.e_o) + def time_2_broadcast(self): np.where(self.cond, self.d, 0) + + def time_all_zeros(self): + np.where(self.all_zeros) + + def time_random_01_percent(self): + np.where(self.rand_cond_01) + + def time_random_20_percent(self): + np.where(self.rand_cond_20) + + def time_random_30_percent(self): + np.where(self.rand_cond_30) + + def time_random_40_percent(self): + np.where(self.rand_cond_40) + + def time_random_50_percent(self): + np.where(self.rand_cond_50) + + def time_all_ones(self): + np.where(self.all_ones) + + def time_interleaved_zeros_x2(self): + np.where(self.rep_zeros_2) + + def time_interleaved_zeros_x4(self): + np.where(self.rep_zeros_4) + + def time_interleaved_zeros_x8(self): + np.where(self.rep_zeros_8) + + def time_interleaved_ones_x2(self): + np.where(self.rep_ones_2) + + def time_interleaved_ones_x4(self): + np.where(self.rep_ones_4) + + def time_interleaved_ones_x8(self): + np.where(self.rep_ones_8) + diff --git a/benchmarks/benchmarks/bench_import.py b/benchmarks/benchmarks/bench_import.py index 83edecafebea..4b6ecbc7bbb1 100644 --- a/benchmarks/benchmarks/bench_import.py +++ b/benchmarks/benchmarks/bench_import.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import, division, print_function - from subprocess import call from sys import executable from timeit import default_timer diff --git a/benchmarks/benchmarks/bench_indexing.py b/benchmarks/benchmarks/bench_indexing.py index a62a2050e283..5b9848420840 100644 --- a/benchmarks/benchmarks/bench_indexing.py +++ b/benchmarks/benchmarks/bench_indexing.py @@ -1,43 +1,89 @@ -from __future__ import absolute_import, division, print_function - -from .common import Benchmark, get_squares_, get_indexes_, get_indexes_rand_ +from .common import ( + Benchmark, get_square_, get_indexes_, get_indexes_rand_, TYPES1) from os.path import join as pjoin import shutil -import sys -import six from numpy import memmap, float32, array import numpy as np from tempfile import mkdtemp class Indexing(Benchmark): - params = [["indexes_", "indexes_rand_"], + params = [TYPES1 + ["object", "O,i"], + ["indexes_", "indexes_rand_"], ['I', ':,I', 'np.ix_(I, I)'], ['', '=1']] - param_names = ['indexes', 'sel', 'op'] + param_names = ['dtype', 'indexes', 'sel', 'op'] - def setup(self, indexes, sel, op): + def setup(self, dtype, indexes, sel, op): sel = sel.replace('I', indexes) - ns = {'squares_': get_squares_(), + ns = {'a': get_square_(dtype), 'np': np, 'indexes_': get_indexes_(), 'indexes_rand_': get_indexes_rand_()} - if sys.version_info[0] >= 3: - code = "def run():\n for a in squares_.values(): a[%s]%s" - else: - code = "def run():\n for a in squares_.itervalues(): a[%s]%s" + code = "def run():\n a[%s]%s" code = code % (sel, op) - six.exec_(code, ns) + exec(code, ns) self.func = ns['run'] - def time_op(self, indexes, sel, op): + def time_op(self, dtype, indexes, sel, op): self.func() +class IndexingWith1DArr(Benchmark): + # Benchmark similar to the take one + params = [ + [(1000,), (1000, 1), (1000, 2), (2, 1000, 1), (1000, 3)], + TYPES1 + ["O", "i,O"]] + param_names = ["shape", "dtype"] + + def setup(self, shape, dtype): + self.arr = np.ones(shape, dtype) + self.index = np.arange(1000) + # index the second dimension: + if len(shape) == 3: + self.index = (slice(None), self.index) + + def time_getitem_ordered(self, shape, dtype): + self.arr[self.index] + + def time_setitem_ordered(self, shape, dtype): + self.arr[self.index] = 0 + + +class ScalarIndexing(Benchmark): + params = [[0, 1, 2]] + param_names = ["ndim"] + + def setup(self, ndim): + self.array = np.ones((5,) * ndim) + + def time_index(self, ndim): + # time indexing. + arr = self.array + indx = (1,) * ndim + for i in range(100): + arr[indx] + + def time_assign(self, ndim): + # time assignment from a python scalar + arr = self.array + indx = (1,) * ndim + for i in range(100): + arr[indx] = 5. + + def time_assign_cast(self, ndim): + # time an assignment which may use a cast operation + arr = self.array + indx = (1,) * ndim + val = np.int16(43) + for i in range(100): + arr[indx] = val + + class IndexingSeparate(Benchmark): def setup(self): self.tmp_dir = mkdtemp() diff --git a/benchmarks/benchmarks/bench_io.py b/benchmarks/benchmarks/bench_io.py index 439cd422f5fc..e316d07f3582 100644 --- a/benchmarks/benchmarks/bench_io.py +++ b/benchmarks/benchmarks/bench_io.py @@ -1,9 +1,7 @@ -from __future__ import absolute_import, division, print_function - -from .common import Benchmark, get_squares +from .common import Benchmark, get_squares, get_squares_ import numpy as np -from io import StringIO +from io import SEEK_SET, StringIO, BytesIO class Copy(Benchmark): @@ -69,6 +67,15 @@ def time_vb_savez_squares(self): np.savez('tmp.npz', **self.squares) +class LoadNpyOverhead(Benchmark): + def setup(self): + self.buffer = BytesIO() + np.save(self.buffer, get_squares_()['float32']) + + def time_loadnpy_overhead(self): + self.buffer.seek(0, SEEK_SET) + np.load(self.buffer) + class LoadtxtCSVComments(Benchmark): # benchmarks for np.loadtxt comment handling # when reading in CSV files @@ -77,12 +84,12 @@ class LoadtxtCSVComments(Benchmark): param_names = ['num_lines'] def setup(self, num_lines): - data = [u'1,2,3 # comment'] * num_lines + data = ['1,2,3 # comment'] * num_lines # unfortunately, timeit will only run setup() # between repeat events, but not for iterations # within repeats, so the StringIO object # will have to be rewinded in the benchmark proper - self.data_comments = StringIO(u'\n'.join(data)) + self.data_comments = StringIO('\n'.join(data)) def time_comment_loadtxt_csv(self, num_lines): # benchmark handling of lines with comments @@ -95,7 +102,7 @@ def time_comment_loadtxt_csv(self, num_lines): # confounding timing result somewhat) for every # call to timing test proper np.loadtxt(self.data_comments, - delimiter=u',') + delimiter=',') self.data_comments.seek(0) class LoadtxtCSVdtypes(Benchmark): @@ -108,8 +115,8 @@ class LoadtxtCSVdtypes(Benchmark): param_names = ['dtype', 'num_lines'] def setup(self, dtype, num_lines): - data = [u'5, 7, 888'] * num_lines - self.csv_data = StringIO(u'\n'.join(data)) + data = ['5, 7, 888'] * num_lines + self.csv_data = StringIO('\n'.join(data)) def time_loadtxt_dtypes_csv(self, dtype, num_lines): # benchmark loading arrays of various dtypes @@ -119,7 +126,7 @@ def time_loadtxt_dtypes_csv(self, dtype, num_lines): # rewind of StringIO object np.loadtxt(self.csv_data, - delimiter=u',', + delimiter=',', dtype=dtype) self.csv_data.seek(0) @@ -129,15 +136,15 @@ class LoadtxtCSVStructured(Benchmark): def setup(self): num_lines = 50000 - data = [u"M, 21, 72, X, 155"] * num_lines - self.csv_data = StringIO(u'\n'.join(data)) + data = ["M, 21, 72, X, 155"] * num_lines + self.csv_data = StringIO('\n'.join(data)) def time_loadtxt_csv_struct_dtype(self): # obligate rewind of StringIO object # between iterations of a repeat: np.loadtxt(self.csv_data, - delimiter=u',', + delimiter=',', dtype=[('category_1', 'S1'), ('category_2', 'i4'), ('category_3', 'f8'), @@ -176,10 +183,10 @@ class LoadtxtReadUint64Integers(Benchmark): def setup(self, size): arr = np.arange(size).astype('uint64') + 2**63 - self.data1 = StringIO(u'\n'.join(arr.astype(str).tolist())) + self.data1 = StringIO('\n'.join(arr.astype(str).tolist())) arr = arr.astype(object) arr[500] = -1 - self.data2 = StringIO(u'\n'.join(arr.astype(str).tolist())) + self.data2 = StringIO('\n'.join(arr.astype(str).tolist())) def time_read_uint64(self, size): # mandatory rewind of StringIO object @@ -202,14 +209,14 @@ class LoadtxtUseColsCSV(Benchmark): def setup(self, usecols): num_lines = 5000 - data = [u'0, 1, 2, 3, 4, 5, 6, 7, 8, 9'] * num_lines - self.csv_data = StringIO(u'\n'.join(data)) + data = ['0, 1, 2, 3, 4, 5, 6, 7, 8, 9'] * num_lines + self.csv_data = StringIO('\n'.join(data)) def time_loadtxt_usecols_csv(self, usecols): # must rewind StringIO because of state # dependence of file reading np.loadtxt(self.csv_data, - delimiter=u',', + delimiter=',', usecols=usecols) self.csv_data.seek(0) @@ -227,7 +234,7 @@ def setup(self, num_lines): dates = np.arange('today', 20, dtype=np.datetime64) np.random.seed(123) values = np.random.rand(20) - date_line = u'' + date_line = '' for date, value in zip(dates, values): date_line += (str(date) + ',' + str(value) + '\n') @@ -240,7 +247,7 @@ def time_loadtxt_csv_datetime(self, num_lines): # rewind StringIO object -- the timing iterations # are state-dependent X = np.loadtxt(self.csv_data, - delimiter=u',', + delimiter=',', dtype=([('dates', 'M8[us]'), ('values', 'float64')])) self.csv_data.seek(0) diff --git a/benchmarks/benchmarks/bench_itemselection.py b/benchmarks/benchmarks/bench_itemselection.py new file mode 100644 index 000000000000..46a39372cccb --- /dev/null +++ b/benchmarks/benchmarks/bench_itemselection.py @@ -0,0 +1,61 @@ +from .common import Benchmark, TYPES1 + +import numpy as np + + +class Take(Benchmark): + params = [ + [(1000, 1), (1000, 2), (2, 1000, 1), (1000, 3)], + ["raise", "wrap", "clip"], + TYPES1 + ["O", "i,O"]] + param_names = ["shape", "mode", "dtype"] + + def setup(self, shape, mode, dtype): + self.arr = np.ones(shape, dtype) + self.indices = np.arange(1000) + + def time_contiguous(self, shape, mode, dtype): + self.arr.take(self.indices, axis=-2, mode=mode) + + +class PutMask(Benchmark): + params = [ + [True, False], + TYPES1 + ["O", "i,O"]] + param_names = ["values_is_scalar", "dtype"] + + def setup(self, values_is_scalar, dtype): + if values_is_scalar: + self.vals = np.array(1., dtype=dtype) + else: + self.vals = np.ones(1000, dtype=dtype) + + self.arr = np.ones(1000, dtype=dtype) + + self.dense_mask = np.ones(1000, dtype="bool") + self.sparse_mask = np.zeros(1000, dtype="bool") + + def time_dense(self, values_is_scalar, dtype): + np.putmask(self.arr, self.dense_mask, self.vals) + + def time_sparse(self, values_is_scalar, dtype): + np.putmask(self.arr, self.sparse_mask, self.vals) + + +class Put(Benchmark): + params = [ + [True, False], + TYPES1 + ["O", "i,O"]] + param_names = ["values_is_scalar", "dtype"] + + def setup(self, values_is_scalar, dtype): + if values_is_scalar: + self.vals = np.array(1., dtype=dtype) + else: + self.vals = np.ones(1000, dtype=dtype) + + self.arr = np.ones(1000, dtype=dtype) + self.indx = np.arange(1000, dtype=np.intp) + + def time_ordered(self, values_is_scalar, dtype): + np.put(self.arr, self.indx, self.vals) diff --git a/benchmarks/benchmarks/bench_lib.py b/benchmarks/benchmarks/bench_lib.py index f65a96dadd3a..f792116a6b9c 100644 --- a/benchmarks/benchmarks/bench_lib.py +++ b/benchmarks/benchmarks/bench_lib.py @@ -1,8 +1,6 @@ """Benchmarks for `numpy.lib`.""" -from __future__ import absolute_import, division, print_function - from .common import Benchmark import numpy as np @@ -55,6 +53,7 @@ def setup(self, shape, pad_width, mode): def time_pad(self, shape, pad_width, mode): np.pad(self.array, pad_width, mode) + class Nan(Benchmark): """Benchmarks for nan functions""" @@ -115,3 +114,60 @@ def time_nanquantile(self, array_size, percent_nans): def time_nanpercentile(self, array_size, percent_nans): np.nanpercentile(self.arr, q=50) + + +class Unique(Benchmark): + """Benchmark for np.unique with np.nan values.""" + + param_names = ["array_size", "percent_nans"] + params = [ + # sizes of the 1D arrays + [200, int(2e5)], + # percent of np.nan in arrays + [0, 0.1, 2., 50., 90.], + ] + + def setup(self, array_size, percent_nans): + np.random.seed(123) + # produce a randomly shuffled array with the + # approximate desired percentage np.nan content + base_array = np.random.uniform(size=array_size) + n_nan = int(percent_nans * array_size) + nan_indices = np.random.choice(np.arange(array_size), size=n_nan) + base_array[nan_indices] = np.nan + self.arr = base_array + + def time_unique_values(self, array_size, percent_nans): + np.unique(self.arr, return_index=False, + return_inverse=False, return_counts=False) + + def time_unique_counts(self, array_size, percent_nans): + np.unique(self.arr, return_index=False, + return_inverse=False, return_counts=True) + + def time_unique_inverse(self, array_size, percent_nans): + np.unique(self.arr, return_index=False, + return_inverse=True, return_counts=False) + + def time_unique_all(self, array_size, percent_nans): + np.unique(self.arr, return_index=True, + return_inverse=True, return_counts=True) + + +class Isin(Benchmark): + """Benchmarks for `numpy.isin`.""" + + param_names = ["size", "highest_element"] + params = [ + [10, 100000, 3000000], + [10, 10000, int(1e8)] + ] + + def setup(self, size, highest_element): + self.array = np.random.randint( + low=0, high=highest_element, size=size) + self.in_array = np.random.randint( + low=0, high=highest_element, size=size) + + def time_isin(self, size, highest_element): + np.isin(self.array, self.in_array) diff --git a/benchmarks/benchmarks/bench_linalg.py b/benchmarks/benchmarks/bench_linalg.py index 5c44162a23cf..b4e39b084b08 100644 --- a/benchmarks/benchmarks/bench_linalg.py +++ b/benchmarks/benchmarks/bench_linalg.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark, get_squares_, get_indexes_rand, TYPES1 import numpy as np @@ -93,13 +91,25 @@ def setup(self, op, typename): # check that dtype is supported at all try: self.func(self.a[:2, :2]) - except TypeError: - raise NotImplementedError() + except TypeError as e: + raise NotImplementedError() from e def time_op(self, op, typename): self.func(self.a) +class LinalgSmallArrays(Benchmark): + """ Test overhead of linalg methods for small arrays """ + def setup(self): + self.array_5 = np.arange(5.) + self.array_5_5 = np.arange(5.) + + def time_norm_small_array(self): + np.linalg.norm(self.array_5) + + def time_det_small_array(self): + np.linalg.det(self.array_5_5) + class Lstsq(Benchmark): def setup(self): self.a = get_squares_()['float64'] @@ -107,3 +117,100 @@ def setup(self): def time_numpy_linalg_lstsq_a__b_float64(self): np.linalg.lstsq(self.a, self.b, rcond=-1) + +class Einsum(Benchmark): + param_names = ['dtype'] + params = [[np.float32, np.float64]] + def setup(self, dtype): + self.one_dim_small = np.arange(600, dtype=dtype) + self.one_dim = np.arange(3000, dtype=dtype) + self.one_dim_big = np.arange(480000, dtype=dtype) + self.two_dim_small = np.arange(1200, dtype=dtype).reshape(30, 40) + self.two_dim = np.arange(240000, dtype=dtype).reshape(400, 600) + self.three_dim_small = np.arange(10000, dtype=dtype).reshape(10,100,10) + self.three_dim = np.arange(24000, dtype=dtype).reshape(20, 30, 40) + # non_contiguous arrays + self.non_contiguous_dim1_small = np.arange(1, 80, 2, dtype=dtype) + self.non_contiguous_dim1 = np.arange(1, 4000, 2, dtype=dtype) + self.non_contiguous_dim2 = np.arange(1, 2400, 2, dtype=dtype).reshape(30, 40) + self.non_contiguous_dim3 = np.arange(1, 48000, 2, dtype=dtype).reshape(20, 30, 40) + + # outer(a,b): trigger sum_of_products_contig_stride0_outcontig_two + def time_einsum_outer(self, dtype): + np.einsum("i,j", self.one_dim, self.one_dim, optimize=True) + + # multiply(a, b):trigger sum_of_products_contig_two + def time_einsum_multiply(self, dtype): + np.einsum("..., ...", self.two_dim_small, self.three_dim , optimize=True) + + # sum and multiply:trigger sum_of_products_contig_stride0_outstride0_two + def time_einsum_sum_mul(self, dtype): + np.einsum(",i...->", 300, self.three_dim_small, optimize=True) + + # sum and multiply:trigger sum_of_products_stride0_contig_outstride0_two + def time_einsum_sum_mul2(self, dtype): + np.einsum("i...,->", self.three_dim_small, 300, optimize=True) + + # scalar mul: trigger sum_of_products_stride0_contig_outcontig_two + def time_einsum_mul(self, dtype): + np.einsum("i,->i", self.one_dim_big, 300, optimize=True) + + # trigger contig_contig_outstride0_two + def time_einsum_contig_contig(self, dtype): + np.einsum("ji,i->", self.two_dim, self.one_dim_small, optimize=True) + + # trigger sum_of_products_contig_outstride0_one + def time_einsum_contig_outstride0(self, dtype): + np.einsum("i->", self.one_dim_big, optimize=True) + + # outer(a,b): non_contiguous arrays + def time_einsum_noncon_outer(self, dtype): + np.einsum("i,j", self.non_contiguous_dim1, self.non_contiguous_dim1, optimize=True) + + # multiply(a, b):non_contiguous arrays + def time_einsum_noncon_multiply(self, dtype): + np.einsum("..., ...", self.non_contiguous_dim2, self.non_contiguous_dim3, optimize=True) + + # sum and multiply:non_contiguous arrays + def time_einsum_noncon_sum_mul(self, dtype): + np.einsum(",i...->", 300, self.non_contiguous_dim3, optimize=True) + + # sum and multiply:non_contiguous arrays + def time_einsum_noncon_sum_mul2(self, dtype): + np.einsum("i...,->", self.non_contiguous_dim3, 300, optimize=True) + + # scalar mul: non_contiguous arrays + def time_einsum_noncon_mul(self, dtype): + np.einsum("i,->i", self.non_contiguous_dim1, 300, optimize=True) + + # contig_contig_outstride0_two: non_contiguous arrays + def time_einsum_noncon_contig_contig(self, dtype): + np.einsum("ji,i->", self.non_contiguous_dim2, self.non_contiguous_dim1_small, optimize=True) + + # sum_of_products_contig_outstride0_oneīŧšnon_contiguous arrays + def time_einsum_noncon_contig_outstride0(self, dtype): + np.einsum("i->", self.non_contiguous_dim1, optimize=True) + + +class LinAlgTransposeVdot(Benchmark): + # Smaller for speed + # , (128, 128), (256, 256), (512, 512), + # (1024, 1024) + params = [[(16, 16), (32, 32), + (64, 64)], TYPES1] + param_names = ['shape', 'npdtypes'] + + def setup(self, shape, npdtypes): + self.xarg = np.random.uniform(-1, 1, np.dot(*shape)).reshape(shape) + self.xarg = self.xarg.astype(npdtypes) + self.x2arg = np.random.uniform(-1, 1, np.dot(*shape)).reshape(shape) + self.x2arg = self.x2arg.astype(npdtypes) + if npdtypes.startswith('complex'): + self.xarg += self.xarg.T*1j + self.x2arg += self.x2arg.T*1j + + def time_transpose(self, shape, npdtypes): + np.transpose(self.xarg) + + def time_vdot(self, shape, npdtypes): + np.vdot(self.xarg, self.x2arg) diff --git a/benchmarks/benchmarks/bench_ma.py b/benchmarks/benchmarks/bench_ma.py index aff78df0a5aa..49ccf92fefcd 100644 --- a/benchmarks/benchmarks/bench_ma.py +++ b/benchmarks/benchmarks/bench_ma.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark import numpy as np @@ -19,6 +17,14 @@ def time_masked_array_l100(self): def time_masked_array_l100_t100(self): np.ma.masked_array(self.l100, self.t100) +class MACreation(Benchmark): + param_names = ['data', 'mask'] + params = [[10, 100, 1000], + [True, False, None]] + + def time_ma_creations(self, data, mask): + np.ma.array(data=np.zeros(int(data)), mask=mask) + class Indexing(Benchmark): param_names = ['masked', 'ndim', 'size'] @@ -113,3 +119,149 @@ def setup(self, mode, n): def time_it(self, mode, n): np.ma.concatenate(self.args) + + +class MAFunctions1v(Benchmark): + param_names = ['mtype', 'func', 'msize'] + params = [['np', 'np.ma'], + ['sin', 'log', 'sqrt'], + ['small', 'big']] + + def setup(self, mtype, func, msize): + xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + m1 = [[True, False, False], [False, False, True]] + xl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + maskx = xl > 0.8 + self.nmxs = np.ma.array(xs, mask=m1) + self.nmxl = np.ma.array(xl, mask=maskx) + + def time_functions_1v(self, mtype, func, msize): + # fun = {'np.ma.sin': np.ma.sin, 'np.sin': np.sin}[func] + fun = eval(f"{mtype}.{func}") + if msize == 'small': + fun(self.nmxs) + elif msize == 'big': + fun(self.nmxl) + + +class MAMethod0v(Benchmark): + param_names = ['method', 'msize'] + params = [['ravel', 'transpose', 'compressed', 'conjugate'], + ['small', 'big']] + + def setup(self, method, msize): + xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + m1 = [[True, False, False], [False, False, True]] + xl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + maskx = xl > 0.8 + self.nmxs = np.ma.array(xs, mask=m1) + self.nmxl = np.ma.array(xl, mask=maskx) + + def time_methods_0v(self, method, msize): + if msize == 'small': + mdat = self.nmxs + elif msize == 'big': + mdat = self.nmxl + getattr(mdat, method)() + + +class MAFunctions2v(Benchmark): + param_names = ['mtype', 'func', 'msize'] + params = [['np', 'np.ma'], + ['multiply', 'divide', 'power'], + ['small', 'big']] + + def setup(self, mtype, func, msize): + # Small arrays + xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + ys = np.random.uniform(-1, 1, 6).reshape(2, 3) + m1 = [[True, False, False], [False, False, True]] + m2 = [[True, False, True], [False, False, True]] + self.nmxs = np.ma.array(xs, mask=m1) + self.nmys = np.ma.array(ys, mask=m2) + # Big arrays + xl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + yl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + maskx = xl > 0.8 + masky = yl < -0.8 + self.nmxl = np.ma.array(xl, mask=maskx) + self.nmyl = np.ma.array(yl, mask=masky) + + def time_functions_2v(self, mtype, func, msize): + fun = eval(f"{mtype}.{func}") + if msize == 'small': + fun(self.nmxs, self.nmys) + elif msize == 'big': + fun(self.nmxl, self.nmyl) + + +class MAMethodGetItem(Benchmark): + param_names = ['margs', 'msize'] + params = [[0, (0, 0), [0, -1]], + ['small', 'big']] + + def setup(self, margs, msize): + xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + m1 = [[True, False, False], [False, False, True]] + xl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + maskx = xl > 0.8 + self.nmxs = np.ma.array(xs, mask=m1) + self.nmxl = np.ma.array(xl, mask=maskx) + + def time_methods_getitem(self, margs, msize): + if msize == 'small': + mdat = self.nmxs + elif msize == 'big': + mdat = self.nmxl + getattr(mdat, '__getitem__')(margs) + + +class MAMethodSetItem(Benchmark): + param_names = ['margs', 'mset', 'msize'] + params = [[0, (0, 0), (-1, 0)], + [17, np.ma.masked], + ['small', 'big']] + + def setup(self, margs, mset, msize): + xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + m1 = [[True, False, False], [False, False, True]] + xl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + maskx = xl > 0.8 + self.nmxs = np.ma.array(xs, mask=m1) + self.nmxl = np.ma.array(xl, mask=maskx) + + def time_methods_setitem(self, margs, mset, msize): + if msize == 'small': + mdat = self.nmxs + elif msize == 'big': + mdat = self.nmxl + getattr(mdat, '__setitem__')(margs, mset) + + +class Where(Benchmark): + param_names = ['mtype', 'msize'] + params = [['np', 'np.ma'], + ['small', 'big']] + + def setup(self, mtype, msize): + # Small arrays + xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + ys = np.random.uniform(-1, 1, 6).reshape(2, 3) + m1 = [[True, False, False], [False, False, True]] + m2 = [[True, False, True], [False, False, True]] + self.nmxs = np.ma.array(xs, mask=m1) + self.nmys = np.ma.array(ys, mask=m2) + # Big arrays + xl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + yl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + maskx = xl > 0.8 + masky = yl < -0.8 + self.nmxl = np.ma.array(xl, mask=maskx) + self.nmyl = np.ma.array(yl, mask=masky) + + def time_where(self, mtype, msize): + fun = eval(f"{mtype}.where") + if msize == 'small': + fun(self.nmxs > 2, self.nmxs, self.nmys) + elif msize == 'big': + fun(self.nmxl > 2, self.nmxl, self.nmyl) diff --git a/benchmarks/benchmarks/bench_manipulate.py b/benchmarks/benchmarks/bench_manipulate.py new file mode 100644 index 000000000000..0a312479cd0d --- /dev/null +++ b/benchmarks/benchmarks/bench_manipulate.py @@ -0,0 +1,107 @@ +from .common import Benchmark, get_squares_, TYPES1, DLPACK_TYPES + +import numpy as np +from collections import deque + +class BroadcastArrays(Benchmark): + params = [[(16, 32), (32, 64), + (64, 128), (128, 256), + (256, 512), (512, 1024)], + TYPES1] + param_names = ['shape', 'ndtype'] + timeout = 10 + + def setup(self, shape, ndtype): + self.xarg = np.random.ranf(shape[0]*shape[1]).reshape(shape) + self.xarg = self.xarg.astype(ndtype) + if ndtype.startswith('complex'): + self.xarg += np.random.ranf(1)*1j + + def time_broadcast_arrays(self, shape, ndtype): + np.broadcast_arrays(self.xarg, np.ones(1)) + + +class BroadcastArraysTo(Benchmark): + params = [[16, 32, 64, 128, 256, 512], + TYPES1] + param_names = ['size', 'ndtype'] + timeout = 10 + + def setup(self, size, ndtype): + self.rng = np.random.default_rng() + self.xarg = self.rng.random(size) + self.xarg = self.xarg.astype(ndtype) + if ndtype.startswith('complex'): + self.xarg += self.rng.random(1)*1j + + def time_broadcast_to(self, size, ndtype): + np.broadcast_to(self.xarg, (size, size)) + + +class ConcatenateStackArrays(Benchmark): + # (64, 128), (128, 256), (256, 512) + params = [[(16, 32), (32, 64)], + [2, 3, 4, 5], + TYPES1] + param_names = ['shape', 'narrays', 'ndtype'] + timeout = 10 + + def setup(self, shape, narrays, ndtype): + self.xarg = [np.random.ranf(shape[0]*shape[1]).reshape(shape) + for x in range(narrays)] + self.xarg = [x.astype(ndtype) for x in self.xarg] + if ndtype.startswith('complex'): + [x + np.random.ranf(1)*1j for x in self.xarg] + + def time_concatenate_ax0(self, size, narrays, ndtype): + np.concatenate(self.xarg, axis=0) + + def time_concatenate_ax1(self, size, narrays, ndtype): + np.concatenate(self.xarg, axis=1) + + def time_stack_ax0(self, size, narrays, ndtype): + np.stack(self.xarg, axis=0) + + def time_stack_ax1(self, size, narrays, ndtype): + np.stack(self.xarg, axis=1) + + +class DimsManipulations(Benchmark): + params = [ + [(2, 1, 4), (2, 1), (5, 2, 3, 1)], + ] + param_names = ['shape'] + timeout = 10 + + def setup(self, shape): + self.xarg = np.ones(shape=shape) + self.reshaped = deque(shape) + self.reshaped.rotate(1) + self.reshaped = tuple(self.reshaped) + + def time_expand_dims(self, shape): + np.expand_dims(self.xarg, axis=1) + + def time_expand_dims_neg(self, shape): + np.expand_dims(self.xarg, axis=-1) + + def time_squeeze_dims(self, shape): + np.squeeze(self.xarg) + + def time_flip_all(self, shape): + np.flip(self.xarg, axis=None) + + def time_flip_one(self, shape): + np.flip(self.xarg, axis=1) + + def time_flip_neg(self, shape): + np.flip(self.xarg, axis=-1) + + def time_moveaxis(self, shape): + np.moveaxis(self.xarg, [0, 1], [-1, -2]) + + def time_roll(self, shape): + np.roll(self.xarg, 3) + + def time_reshape(self, shape): + np.reshape(self.xarg, self.reshaped) diff --git a/benchmarks/benchmarks/bench_overrides.py b/benchmarks/benchmarks/bench_overrides.py index 58572d07d050..e449517851ec 100644 --- a/benchmarks/benchmarks/bench_overrides.py +++ b/benchmarks/benchmarks/bench_overrides.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark try: @@ -35,7 +33,7 @@ def mock_concatenate(arrays, axis=0, out=None): pass -class DuckArray(object): +class DuckArray: def __array_function__(self, func, types, args, kwargs): pass diff --git a/benchmarks/benchmarks/bench_random.py b/benchmarks/benchmarks/bench_random.py index c52b463e5797..9482eb04de97 100644 --- a/benchmarks/benchmarks/bench_random.py +++ b/benchmarks/benchmarks/bench_random.py @@ -1,11 +1,7 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark import numpy as np -from numpy.random import RandomState - try: from numpy.random import Generator except ImportError: diff --git a/benchmarks/benchmarks/bench_records.py b/benchmarks/benchmarks/bench_records.py index 41a6dd775bb4..2d9c104d2904 100644 --- a/benchmarks/benchmarks/bench_records.py +++ b/benchmarks/benchmarks/bench_records.py @@ -1,6 +1,3 @@ -from __future__ import absolute_import, division, print_function -import os - from .common import Benchmark import numpy as np diff --git a/benchmarks/benchmarks/bench_reduce.py b/benchmarks/benchmarks/bench_reduce.py index 0043d5357575..040b5ca73ce2 100644 --- a/benchmarks/benchmarks/bench_reduce.py +++ b/benchmarks/benchmarks/bench_reduce.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark, TYPES1, get_squares import numpy as np @@ -47,18 +45,77 @@ def time_any_slow(self): self.zeros.any() -class MinMax(Benchmark): - params = [np.float32, np.float64, np.intp] +class StatsReductions(Benchmark): + # Not testing, but in array_api (redundant) + # 8, 16, 32 bit variants, and 128 complexes + params = ['int64', 'uint64', 'float64', 'intp', + 'complex64', 'bool', 'float', 'int', + 'complex', 'complex256'], + param_names = ['dtype'] + + def setup(self, dtype): + try: + self.data = np.ones(200, dtype=getattr(np, dtype)) + except AttributeError: # builtins throw AttributeError after 1.20 + self.data = np.ones(200, dtype=dtype) + if dtype.startswith('complex'): + self.data = self.data * self.data.T*1j + + def time_min(self, dtype): + np.min(self.data) + + def time_max(self, dtype): + np.max(self.data) + + def time_mean(self, dtype): + np.mean(self.data) + + def time_std(self, dtype): + np.std(self.data) + + def time_prod(self, dtype): + np.prod(self.data) + + def time_var(self, dtype): + np.var(self.data) + + +class FMinMax(Benchmark): + params = [np.float32, np.float64] param_names = ['dtype'] def setup(self, dtype): self.d = np.ones(20000, dtype=dtype) def time_min(self, dtype): - np.min(self.d) + np.fmin.reduce(self.d) def time_max(self, dtype): - np.max(self.d) + np.fmax.reduce(self.d) + + +class ArgMax(Benchmark): + params = [np.int8, np.uint8, np.int16, np.uint16, np.int32, np.uint32, + np.int64, np.uint64, np.float32, np.float64, bool] + param_names = ['dtype'] + + def setup(self, dtype): + self.d = np.zeros(200000, dtype=dtype) + + def time_argmax(self, dtype): + np.argmax(self.d) + + +class ArgMin(Benchmark): + params = [np.int8, np.uint8, np.int16, np.uint16, np.int32, np.uint32, + np.int64, np.uint64, np.float32, np.float64, bool] + param_names = ['dtype'] + + def setup(self, dtype): + self.d = np.ones(200000, dtype=dtype) + + def time_argmin(self, dtype): + np.argmin(self.d) class SmallReduction(Benchmark): diff --git a/benchmarks/benchmarks/bench_scalar.py b/benchmarks/benchmarks/bench_scalar.py new file mode 100644 index 000000000000..638f66df5bde --- /dev/null +++ b/benchmarks/benchmarks/bench_scalar.py @@ -0,0 +1,79 @@ +from .common import Benchmark, TYPES1 + +import numpy as np + + +class ScalarMath(Benchmark): + # Test scalar math, note that each of these is run repeatedly to offset + # the function call overhead to some degree. + params = [TYPES1] + param_names = ["type"] + def setup(self, typename): + self.num = np.dtype(typename).type(2) + self.int32 = np.int32(2) + self.int32arr = np.array(2, dtype=np.int32) + + def time_addition(self, typename): + n = self.num + res = n + n + n + n + n + n + n + n + n + n + + def time_addition_pyint(self, typename): + n = self.num + res = n + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + def time_multiplication(self, typename): + n = self.num + res = n * n * n * n * n * n * n * n * n * n + + def time_power_of_two(self, typename): + n = self.num + res = n**2, n**2, n**2, n**2, n**2, n**2, n**2, n**2, n**2, n**2 + + def time_abs(self, typename): + n = self.num + res = abs(abs(abs(abs(abs(abs(abs(abs(abs(abs(n)))))))))) + + def time_add_int32_other(self, typename): + # Some mixed cases are fast, some are slow, this documents these + # differences. (When writing, it was fast if the type of the result + # is one of the inputs.) + int32 = self.int32 + other = self.num + int32 + other + int32 + other + int32 + other + int32 + other + int32 + other + + def time_add_int32arr_and_other(self, typename): + # `arr + scalar` hits the normal ufunc (array) paths. + int32 = self.int32arr + other = self.num + int32 + other + int32 + other + int32 + other + int32 + other + int32 + other + + def time_add_other_and_int32arr(self, typename): + # `scalar + arr` at some point hit scalar paths in some cases, and + # these paths could be optimized more easily + int32 = self.int32arr + other = self.num + other + int32 + other + int32 + other + int32 + other + int32 + other + int32 + + +class ScalarStr(Benchmark): + # Test scalar to str conversion + params = [TYPES1] + param_names = ["type"] + + def setup(self, typename): + self.a = np.array([100] * 100, dtype=typename) + + def time_str_repr(self, typename): + res = [str(x) for x in self.a] diff --git a/benchmarks/benchmarks/bench_shape_base.py b/benchmarks/benchmarks/bench_shape_base.py index 187b923cd27a..375c43dcfe56 100644 --- a/benchmarks/benchmarks/bench_shape_base.py +++ b/benchmarks/benchmarks/bench_shape_base.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import, division, print_function - from .common import Benchmark import numpy as np @@ -136,3 +134,21 @@ def time_3d(self, n, mode): # Retain old benchmark name for backward compat time_3d.benchmark_name = "bench_shape_base.Block.time_3d" + + +class Kron(Benchmark): + """Benchmarks for Kronecker product of two arrays""" + + def setup(self): + self.large_arr = np.random.random((10,) * 4) + self.large_mat = np.mat(np.random.random((100, 100))) + self.scalar = 7 + + def time_arr_kron(self): + np.kron(self.large_arr, self.large_arr) + + def time_scalar_kron(self): + np.kron(self.large_arr, self.scalar) + + def time_mat_kron(self): + np.kron(self.large_mat, self.large_mat) diff --git a/benchmarks/benchmarks/bench_strings.py b/benchmarks/benchmarks/bench_strings.py new file mode 100644 index 000000000000..88d20069e75b --- /dev/null +++ b/benchmarks/benchmarks/bench_strings.py @@ -0,0 +1,43 @@ +from .common import Benchmark + +import numpy as np +import operator + + +_OPERATORS = { + '==': operator.eq, + '!=': operator.ne, + '<': operator.lt, + '<=': operator.le, + '>': operator.gt, + '>=': operator.ge, +} + + +class StringComparisons(Benchmark): + # Basic string comparison speed tests + params = [ + [100, 10000, (1000, 20)], + ['U', 'S'], + [True, False], + ['==', '!=', '<', '<=', '>', '>=']] + param_names = ['shape', 'dtype', 'contig', 'operator'] + int64 = np.dtype(np.int64) + + def setup(self, shape, dtype, contig, operator): + self.arr = np.arange(np.prod(shape)).astype(dtype).reshape(shape) + self.arr_identical = self.arr.copy() + self.arr_different = self.arr[::-1].copy() + + if not contig: + self.arr = self.arr[..., ::2] + self.arr_identical = self.arr_identical[..., ::2] + self.arr_different = self.arr_different[..., ::2] + + self.operator = _OPERATORS[operator] + + def time_compare_identical(self, shape, dtype, contig, operator): + self.operator(self.arr, self.arr_identical) + + def time_compare_different(self, shape, dtype, contig, operator): + self.operator(self.arr, self.arr_different) diff --git a/benchmarks/benchmarks/bench_trim_zeros.py b/benchmarks/benchmarks/bench_trim_zeros.py new file mode 100644 index 000000000000..4e25a8b021b7 --- /dev/null +++ b/benchmarks/benchmarks/bench_trim_zeros.py @@ -0,0 +1,27 @@ +from .common import Benchmark + +import numpy as np + +_FLOAT = np.dtype('float64') +_COMPLEX = np.dtype('complex128') +_INT = np.dtype('int64') +_BOOL = np.dtype('bool') + + +class TrimZeros(Benchmark): + param_names = ["dtype", "size"] + params = [ + [_INT, _FLOAT, _COMPLEX, _BOOL], + [3000, 30_000, 300_000] + ] + + def setup(self, dtype, size): + n = size // 3 + self.array = np.hstack([ + np.zeros(n), + np.random.uniform(size=n), + np.zeros(n), + ]).astype(dtype) + + def time_trim_zeros(self, dtype, size): + np.trim_zeros(self.array) diff --git a/benchmarks/benchmarks/bench_ufunc.py b/benchmarks/benchmarks/bench_ufunc.py index 62e70782d1f7..f7c77d90c1ef 100644 --- a/benchmarks/benchmarks/bench_ufunc.py +++ b/benchmarks/benchmarks/bench_ufunc.py @@ -1,8 +1,9 @@ -from __future__ import absolute_import, division, print_function - -from .common import Benchmark, get_squares_ +from .common import Benchmark, get_squares_, TYPES1, DLPACK_TYPES import numpy as np +import itertools +from packaging import version +import operator ufuncs = ['abs', 'absolute', 'add', 'arccos', 'arccosh', 'arcsin', 'arcsinh', @@ -15,11 +16,13 @@ 'isinf', 'isnan', 'isnat', 'lcm', 'ldexp', 'left_shift', 'less', 'less_equal', 'log', 'log10', 'log1p', 'log2', 'logaddexp', 'logaddexp2', 'logical_and', 'logical_not', 'logical_or', - 'logical_xor', 'matmul', 'maximum', 'minimum', 'mod', 'modf', 'multiply', - 'negative', 'nextafter', 'not_equal', 'positive', 'power', - 'rad2deg', 'radians', 'reciprocal', 'remainder', 'right_shift', - 'rint', 'sign', 'signbit', 'sin', 'sinh', 'spacing', 'sqrt', - 'square', 'subtract', 'tan', 'tanh', 'true_divide', 'trunc'] + 'logical_xor', 'matmul', 'maximum', 'minimum', 'mod', 'modf', + 'multiply', 'negative', 'nextafter', 'not_equal', 'positive', + 'power', 'rad2deg', 'radians', 'reciprocal', 'remainder', + 'right_shift', 'rint', 'sign', 'signbit', 'sin', + 'sinh', 'spacing', 'sqrt', 'square', 'subtract', 'tan', 'tanh', + 'true_divide', 'trunc'] +arrayfuncdisp = ['real', 'round'] for name in dir(np): @@ -27,6 +30,30 @@ print("Missing ufunc %r" % (name,)) +class ArrayFunctionDispatcher(Benchmark): + params = [arrayfuncdisp] + param_names = ['func'] + timeout = 10 + + def setup(self, ufuncname): + np.seterr(all='ignore') + try: + self.afdn = getattr(np, ufuncname) + except AttributeError: + raise NotImplementedError() + self.args = [] + for _, aarg in get_squares_().items(): + arg = (aarg,) * 1 # no nin + try: + self.afdn(*arg) + except TypeError: + continue + self.args.append(arg) + + def time_afdn_types(self, ufuncname): + [self.afdn(*arg) for arg in self.args] + + class Broadcast(Benchmark): def setup(self): self.d = np.ones((50000, 100), dtype=np.float64) @@ -36,6 +63,20 @@ def time_broadcast(self): self.d - self.e +class At(Benchmark): + def setup(self): + rng = np.random.default_rng(1) + self.vals = rng.random(10_000_000, dtype=np.float64) + self.idx = rng.integers(1000, size=10_000_000).astype(np.intp) + self.res = np.zeros(1000, dtype=self.vals.dtype) + + def time_sum_at(self): + np.add.at(self.res, self.idx, self.vals) + + def time_maximum_at(self): + np.maximum.at(self.res, self.idx, self.vals) + + class UFunc(Benchmark): params = [ufuncs] param_names = ['ufunc'] @@ -44,25 +85,218 @@ class UFunc(Benchmark): def setup(self, ufuncname): np.seterr(all='ignore') try: - self.f = getattr(np, ufuncname) + self.ufn = getattr(np, ufuncname) except AttributeError: raise NotImplementedError() self.args = [] - for t, a in get_squares_().items(): - arg = (a,) * self.f.nin + for _, aarg in get_squares_().items(): + arg = (aarg,) * self.ufn.nin try: - self.f(*arg) + self.ufn(*arg) except TypeError: continue self.args.append(arg) def time_ufunc_types(self, ufuncname): - [self.f(*arg) for arg in self.args] + [self.ufn(*arg) for arg in self.args] + + +class MethodsV0(Benchmark): + """ Benchmark for the methods which do not take any arguments + """ + params = [['__abs__', '__neg__', '__pos__'], TYPES1] + param_names = ['methods', 'npdtypes'] + timeout = 10 + + def setup(self, methname, npdtypes): + values = get_squares_() + self.xarg = values.get(npdtypes)[0] + + def time_ndarray_meth(self, methname, npdtypes): + getattr(operator, methname)(self.xarg) + + +class NDArrayLRShifts(Benchmark): + """ Benchmark for the shift methods + """ + params = [['__lshift__', '__rshift__'], + ['intp', 'int8', 'int16', + 'int32', 'int64', 'uint8', + 'uint16', 'uint32', 'uint64']] + param_names = ['methods', 'npdtypes'] + timeout = 10 + + def setup(self, methname, npdtypes): + self.vals = np.ones(1000, + dtype=getattr(np, npdtypes)) * \ + np.random.randint(9) + + def time_ndarray_meth(self, methname, npdtypes): + getattr(operator, methname)(*[self.vals, 2]) + + +class Methods0D(Benchmark): + """Zero dimension array methods + """ + params = [['__bool__', '__complex__', '__invert__', + '__float__', '__int__'], TYPES1] + param_names = ['methods', 'npdtypes'] + timeout = 10 + + def setup(self, methname, npdtypes): + self.xarg = np.array(3, dtype=npdtypes) + if (npdtypes.startswith('complex') and + methname in ['__float__', '__int__']) or \ + (npdtypes.startswith('int') and methname == '__invert__'): + # Skip + raise NotImplementedError + + def time_ndarray__0d__(self, methname, npdtypes): + meth = getattr(self.xarg, methname) + meth() + + +class MethodsV1(Benchmark): + """ Benchmark for the methods which take an argument + """ + params = [['__and__', '__add__', '__eq__', '__floordiv__', '__ge__', + '__gt__', '__le__', '__lt__', '__matmul__', + '__mod__', '__mul__', '__ne__', '__or__', + '__pow__', '__sub__', '__truediv__', '__xor__'], + TYPES1] + param_names = ['methods', 'npdtypes'] + timeout = 10 + + def setup(self, methname, npdtypes): + if ( + npdtypes.startswith("complex") + and methname in ["__floordiv__", "__mod__"] + ) or ( + not npdtypes.startswith("int") + and methname in ["__and__", "__or__", "__xor__"] + ): + raise NotImplementedError # skip + values = get_squares_().get(npdtypes) + self.xargs = [values[0], values[1]] + + def time_ndarray_meth(self, methname, npdtypes): + getattr(operator, methname)(*self.xargs) + + +class NDArrayGetItem(Benchmark): + param_names = ['margs', 'msize'] + params = [[0, (0, 0), (-1, 0), [0, -1]], + ['small', 'big']] + + def setup(self, margs, msize): + self.xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + self.xl = np.random.uniform(-1, 1, 50*50).reshape(50, 50) + + def time_methods_getitem(self, margs, msize): + if msize == 'small': + mdat = self.xs + elif msize == 'big': + mdat = self.xl + getattr(mdat, '__getitem__')(margs) + + +class NDArraySetItem(Benchmark): + param_names = ['margs', 'msize'] + params = [[0, (0, 0), (-1, 0), [0, -1]], + ['small', 'big']] + + def setup(self, margs, msize): + self.xs = np.random.uniform(-1, 1, 6).reshape(2, 3) + self.xl = np.random.uniform(-1, 1, 100*100).reshape(100, 100) + + def time_methods_setitem(self, margs, msize): + if msize == 'small': + mdat = self.xs + elif msize == 'big': + mdat = self.xl + mdat[margs] = 17 + + +class DLPMethods(Benchmark): + """ Benchmark for DLPACK helpers + """ + params = [['__dlpack__', '__dlpack_device__'], DLPACK_TYPES] + param_names = ['methods', 'npdtypes'] + timeout = 10 + + def setup(self, methname, npdtypes): + values = get_squares_() + if npdtypes == 'bool': + if version.parse(np.__version__) > version.parse("1.25"): + self.xarg = values.get('int16')[0].astype('bool') + else: + raise NotImplementedError("Not supported before v1.25") + else: + self.xarg = values.get('int16')[0] + + def time_ndarray_dlp(self, methname, npdtypes): + meth = getattr(self.xarg, methname) + meth() + + +class NDArrayAsType(Benchmark): + """ Benchmark for type conversion + """ + params = [list(itertools.combinations(TYPES1, 2))] + param_names = ['typeconv'] + timeout = 10 + + def setup(self, typeconv): + if typeconv[0] == typeconv[1]: + raise NotImplementedError( + "Skipping test for converting to the same dtype") + self.xarg = get_squares_().get(typeconv[0]) + + def time_astype(self, typeconv): + self.xarg.astype(typeconv[1]) + + +class UFuncSmall(Benchmark): + """ Benchmark for a selection of ufuncs on a small arrays and scalars + + Since the arrays and scalars are small, we are benchmarking the overhead + of the numpy ufunc functionality + """ + params = ['abs', 'sqrt', 'cos'] + param_names = ['ufunc'] + timeout = 10 + + def setup(self, ufuncname): + np.seterr(all='ignore') + try: + self.f = getattr(np, ufuncname) + except AttributeError: + raise NotImplementedError() + self.array_5 = np.array([1., 2., 10., 3., 4.]) + self.array_int_3 = np.array([1, 2, 3]) + self.float64 = np.float64(1.1) + self.python_float = 1.1 + + def time_ufunc_small_array(self, ufuncname): + self.f(self.array_5) + + def time_ufunc_small_array_inplace(self, ufuncname): + self.f(self.array_5, out = self.array_5) + + def time_ufunc_small_int_array(self, ufuncname): + self.f(self.array_int_3) + def time_ufunc_numpy_scalar(self, ufuncname): + self.f(self.float64) + + def time_ufunc_python_float(self, ufuncname): + self.f(self.python_float) + class Custom(Benchmark): def setup(self): self.b = np.ones(20000, dtype=bool) + self.b_small = np.ones(3, dtype=bool) def time_nonzero(self): np.nonzero(self.b) @@ -76,6 +310,9 @@ def time_and_bool(self): def time_or_bool(self): (self.b | self.b) + def time_and_bool_small(self): + (self.b_small & self.b_small) + class CustomInplace(Benchmark): def setup(self): @@ -132,8 +369,55 @@ def time_divide_scalar2(self, dtype): def time_divide_scalar2_inplace(self, dtype): np.divide(self.d, 1, out=self.d) + +class CustomComparison(Benchmark): + params = (np.int8, np.int16, np.int32, np.int64, np.uint8, np.uint16, + np.uint32, np.uint64, np.float32, np.float64, np.bool_) + param_names = ['dtype'] + + def setup(self, dtype): + self.x = np.ones(50000, dtype=dtype) + self.y = np.ones(50000, dtype=dtype) + self.s = np.ones(1, dtype=dtype) + + def time_less_than_binary(self, dtype): + (self.x < self.y) + + def time_less_than_scalar1(self, dtype): + (self.s < self.x) + def time_less_than_scalar2(self, dtype): - (self.d < 1) + (self.x < self.s) + + +class CustomScalarFloorDivideInt(Benchmark): + params = (np.sctypes['int'] + np.sctypes['uint'], [8, -8, 43, -43]) + param_names = ['dtype', 'divisors'] + + def setup(self, dtype, divisor): + if dtype in np.sctypes['uint'] and divisor < 0: + raise NotImplementedError( + "Skipping test for negative divisor with unsigned type") + + iinfo = np.iinfo(dtype) + self.x = np.random.randint( + iinfo.min, iinfo.max, size=10000, dtype=dtype) + + def time_floor_divide_int(self, dtype, divisor): + self.x // divisor + +class CustomArrayFloorDivideInt(Benchmark): + params = (np.sctypes['int'] + np.sctypes['uint'], [100, 10000, 1000000]) + param_names = ['dtype', 'size'] + + def setup(self, dtype, size): + iinfo = np.iinfo(dtype) + self.x = np.random.randint( + iinfo.min, iinfo.max, size=size, dtype=dtype) + self.y = np.random.randint(2, 32, size=size, dtype=dtype) + + def time_floor_divide_int(self, dtype, size): + self.x // self.y class Scalar(Benchmark): @@ -152,7 +436,7 @@ def time_add_scalar_conv_complex(self): (self.y + self.z) -class ArgPack(object): +class ArgPack: __slots__ = ['args', 'kwargs'] def __init__(self, *args, **kwargs): self.args = args @@ -209,3 +493,23 @@ class ArgParsingReduce(Benchmark): def time_add_reduce_arg_parsing(self, arg_pack): np.add.reduce(*arg_pack.args, **arg_pack.kwargs) + +class BinaryBench(Benchmark): + def setup(self): + N = 1000000 + self.a32 = np.random.rand(N).astype(np.float32) + self.b32 = np.random.rand(N).astype(np.float32) + self.a64 = np.random.rand(N).astype(np.float64) + self.b64 = np.random.rand(N).astype(np.float64) + + def time_pow_32(self): + np.power(self.a32, self.b32) + + def time_pow_64(self): + np.power(self.a64, self.b64) + + def time_atan2_32(self): + np.arctan2(self.a32, self.b32) + + def time_atan2_64(self): + np.arctan2(self.a64, self.b64) diff --git a/benchmarks/benchmarks/bench_ufunc_strides.py b/benchmarks/benchmarks/bench_ufunc_strides.py new file mode 100644 index 000000000000..898cc0818ac1 --- /dev/null +++ b/benchmarks/benchmarks/bench_ufunc_strides.py @@ -0,0 +1,223 @@ +from .common import Benchmark, get_data + +import numpy as np + +UFUNCS = [obj for obj in np.core.umath.__dict__.values() if + isinstance(obj, np.ufunc)] +UFUNCS_UNARY = [uf for uf in UFUNCS if "O->O" in uf.types] + +class _AbstractBinary(Benchmark): + params = [] + param_names = ['ufunc', 'stride_in0', 'stride_in1' 'stride_out', 'dtype'] + timeout = 10 + arrlen = 10000 + data_finite = True + data_denormal = False + data_zeros = False + + def setup(self, ufunc, stride_in0, stride_in1, stride_out, dtype): + ufunc_insig = f'{dtype}{dtype}->' + if ufunc_insig+dtype not in ufunc.types: + for st_sig in (ufunc_insig, dtype): + test = [sig for sig in ufunc.types if sig.startswith(st_sig)] + if test: + break + if not test: + raise NotImplementedError( + f"Ufunc {ufunc} doesn't support " + f"binary input of dtype {dtype}" + ) from None + tin, tout = test[0].split('->') + else: + tin = dtype + dtype + tout = dtype + + self.ufunc_args = [] + for i, (dt, stride) in enumerate(zip(tin, (stride_in0, stride_in1))): + self.ufunc_args += [get_data( + self.arrlen*stride, dt, i, + zeros=self.data_zeros, + finite=self.data_finite, + denormal=self.data_denormal, + )[::stride]] + for dt in tout: + self.ufunc_args += [ + np.empty(stride_out*self.arrlen, dt)[::stride_out] + ] + + np.seterr(all='ignore') + + def time_binary(self, ufunc, stride_in0, stride_in1, stride_out, + dtype): + ufunc(*self.ufunc_args) + + def time_binary_scalar_in0(self, ufunc, stride_in0, stride_in1, + stride_out, dtype): + ufunc(self.ufunc_args[0][0], *self.ufunc_args[1:]) + + def time_binary_scalar_in1(self, ufunc, stride_in0, stride_in1, + stride_out, dtype): + ufunc(self.ufunc_args[0], self.ufunc_args[1][0], *self.ufunc_args[2:]) + +class _AbstractUnary(Benchmark): + params = [] + param_names = ['ufunc', 'stride_in', 'stride_out', 'dtype'] + timeout = 10 + arrlen = 10000 + data_finite = True + data_denormal = False + data_zeros = False + + def setup(self, ufunc, stride_in, stride_out, dtype): + arr_in = get_data( + stride_in*self.arrlen, dtype, + zeros=self.data_zeros, + finite=self.data_finite, + denormal=self.data_denormal, + ) + self.ufunc_args = [arr_in[::stride_in]] + + ufunc_insig = f'{dtype}->' + if ufunc_insig+dtype not in ufunc.types: + test = [sig for sig in ufunc.types if sig.startswith(ufunc_insig)] + if not test: + raise NotImplementedError( + f"Ufunc {ufunc} doesn't support " + f"unary input of dtype {dtype}" + ) from None + tout = test[0].split('->')[1] + else: + tout = dtype + + for dt in tout: + self.ufunc_args += [ + np.empty(stride_out*self.arrlen, dt)[::stride_out] + ] + + np.seterr(all='ignore') + + def time_unary(self, ufunc, stride_in, stride_out, dtype): + ufunc(*self.ufunc_args) + +class UnaryFP(_AbstractUnary): + params = [UFUNCS_UNARY, [1, 2, 4], [1, 2, 4], ['e', 'f', 'd']] + + def setup(self, ufunc, stride_in, stride_out, dtype): + _AbstractUnary.setup(self, ufunc, stride_in, stride_out, dtype) + if (ufunc.__name__ == 'arccosh'): + self.ufunc_args[0] += 1.0 + +class UnaryFPSpecial(UnaryFP): + data_finite = False + data_denormal = True + data_zeros = True + +class BinaryFP(_AbstractBinary): + params = [ + [np.maximum, np.minimum, np.fmax, np.fmin, np.ldexp], + [1, 2, 4], [1, 2, 4], [1, 2, 4], ['f', 'd'] + ] + +class BinaryFPSpecial(BinaryFP): + data_finite = False + data_denormal = True + data_zeros = True + +class BinaryComplex(_AbstractBinary): + params = [ + [np.add, np.subtract, np.multiply, np.divide], + [1, 2, 4], [1, 2, 4], [1, 2, 4], + ['F', 'D'] + ] + +class UnaryComplex(_AbstractUnary): + params = [ + [np.reciprocal, np.absolute, np.square, np.conjugate], + [1, 2, 4], [1, 2, 4], ['F', 'D'] + ] + +class BinaryInt(_AbstractBinary): + arrlen = 100000 + params = [ + [np.maximum, np.minimum], + [1, 2], [1, 2], [1, 2], + ['b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'] + ] + +class BinaryIntContig(_AbstractBinary): + params = [ + [getattr(np, uf) for uf in ( + 'add', 'subtract', 'multiply', 'bitwise_and', 'bitwise_or', + 'bitwise_xor', 'logical_and', 'logical_or', 'logical_xor', + 'right_shift', 'left_shift', + )], + [1], [1], [1], + ['b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'] + ] + +class UnaryIntContig(_AbstractUnary): + arrlen = 100000 + params = [ + [getattr(np, uf) for uf in ( + 'positive', 'square', 'reciprocal', 'conjugate', 'logical_not', + 'invert', 'isnan', 'isinf', 'isfinite', + 'absolute', 'sign' + )], + [1], [1], + ['b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'] + ] + +class Mandelbrot(Benchmark): + def f(self,z): + return np.abs(z) < 4.0 + + def g(self,z,c): + return np.sum(np.multiply(z, z) + c) + + def mandelbrot_numpy(self, c, maxiter): + output = np.zeros(c.shape, np.int32) + z = np.empty(c.shape, np.complex64) + for it in range(maxiter): + notdone = self.f(z) + output[notdone] = it + z[notdone] = self.g(z[notdone],c[notdone]) + output[output == maxiter-1] = 0 + return output + + def mandelbrot_set(self,xmin,xmax,ymin,ymax,width,height,maxiter): + r1 = np.linspace(xmin, xmax, width, dtype=np.float32) + r2 = np.linspace(ymin, ymax, height, dtype=np.float32) + c = r1 + r2[:,None]*1j + n3 = self.mandelbrot_numpy(c,maxiter) + return (r1,r2,n3.T) + + def time_mandel(self): + self.mandelbrot_set(-0.74877,-0.74872,0.06505,0.06510,1000,1000,2048) + +class LogisticRegression(Benchmark): + param_names = ['dtype'] + params = [np.float32, np.float64] + + timeout = 1000 + def train(self, max_epoch): + for epoch in range(max_epoch): + z = np.matmul(self.X_train, self.W) + A = 1 / (1 + np.exp(-z)) # sigmoid(z) + loss = -np.mean(self.Y_train * np.log(A) + (1-self.Y_train) * np.log(1-A)) + dz = A - self.Y_train + dw = (1/self.size) * np.matmul(self.X_train.T, dz) + self.W = self.W - self.alpha*dw + + def setup(self, dtype): + np.random.seed(42) + self.size = 250 + features = 16 + self.X_train = np.random.rand(self.size,features).astype(dtype) + self.Y_train = np.random.choice(2,self.size).astype(dtype) + # Initialize weights + self.W = np.zeros((features,1), dtype=dtype) + self.b = np.zeros((1,1), dtype=dtype) + self.alpha = 0.1 + + def time_train(self, dtype): + self.train(1000) diff --git a/benchmarks/benchmarks/common.py b/benchmarks/benchmarks/common.py index 18a09fd40551..4f291dad1118 100644 --- a/benchmarks/benchmarks/common.py +++ b/benchmarks/benchmarks/common.py @@ -1,7 +1,8 @@ -from __future__ import absolute_import, division, print_function - -import numpy +import numpy as np import random +import os +from functools import lru_cache +from pathlib import Path # Various pre-crafted datasets/variables for testing # !!! Must not be changed -- only appended !!! @@ -9,95 +10,102 @@ # sequences random.seed(1) # but will seed it nevertheless -numpy.random.seed(1) +np.random.seed(1) nx, ny = 1000, 1000 # reduced squares based on indexes_rand, primarily for testing more # time-consuming functions (ufunc, linalg, etc) nxs, nys = 100, 100 -# a set of interesting types to test +# a list of interesting types to test TYPES1 = [ 'int16', 'float16', 'int32', 'float32', 'int64', 'float64', 'complex64', - 'longfloat', 'complex128', + 'longdouble', 'complex128', ] -if 'complex256' in numpy.typeDict: - TYPES1.append('complex256') - +if 'complex256' in np.sctypeDict: + TYPES1.append('clongdouble') -def memoize(func): - result = [] - def wrapper(): - if not result: - result.append(func()) - return result[0] - return wrapper +DLPACK_TYPES = [ + 'int16', 'float16', + 'int32', 'float32', + 'int64', 'float64', 'complex64', + 'complex128', 'bool', +] +# Path for caching +CACHE_ROOT = Path(__file__).resolve().parent.parent / 'env' / 'numpy_benchdata' # values which will be used to construct our sample data matrices # replicate 10 times to speed up initial imports of this helper # and generate some redundancy -@memoize +@lru_cache(typed=True) def get_values(): - rnd = numpy.random.RandomState(1) - values = numpy.tile(rnd.uniform(0, 100, size=nx*ny//10), 10) + rnd = np.random.RandomState(1) + values = np.tile(rnd.uniform(0, 100, size=nx*ny//10), 10) return values -@memoize -def get_squares(): +@lru_cache(typed=True) +def get_square(dtype): values = get_values() - squares = {t: numpy.array(values, - dtype=getattr(numpy, t)).reshape((nx, ny)) - for t in TYPES1} + arr = values.astype(dtype=dtype).reshape((nx, ny)) # adjust complex ones to have non-degenerated imagery part -- use # original data transposed for that - for t, v in squares.items(): - if t.startswith('complex'): - v += v.T*1j - return squares + if arr.dtype.kind == 'c': + arr += arr.T*1j + + return arr + +@lru_cache(typed=True) +def get_squares(): + return {t: get_square(t) for t in TYPES1} + + +@lru_cache(typed=True) +def get_square_(dtype): + arr = get_square(dtype) + return arr[:nxs, :nys] -@memoize +@lru_cache(typed=True) def get_squares_(): # smaller squares - squares_ = {t: s[:nxs, :nys] for t, s in get_squares().items()} - return squares_ + return {t: get_square_(t) for t in TYPES1} -@memoize +@lru_cache(typed=True) def get_vectors(): # vectors vectors = {t: s[0] for t, s in get_squares().items()} return vectors -@memoize +@lru_cache(typed=True) def get_indexes(): indexes = list(range(nx)) # so we do not have all items indexes.pop(5) indexes.pop(95) - indexes = numpy.array(indexes) + indexes = np.array(indexes) return indexes -@memoize +@lru_cache(typed=True) def get_indexes_rand(): rnd = random.Random(1) indexes_rand = get_indexes().tolist() # copy rnd.shuffle(indexes_rand) # in-place shuffle - indexes_rand = numpy.array(indexes_rand) + indexes_rand = np.array(indexes_rand) return indexes_rand -@memoize +@lru_cache(typed=True) def get_indexes_(): # smaller versions indexes = get_indexes() @@ -105,12 +113,112 @@ def get_indexes_(): return indexes_ -@memoize +@lru_cache(typed=True) def get_indexes_rand_(): indexes_rand = get_indexes_rand() indexes_rand_ = indexes_rand[indexes_rand < nxs] return indexes_rand_ -class Benchmark(object): - goal_time = 0.25 +@lru_cache(typed=True) +def get_data(size, dtype, ip_num=0, zeros=False, finite=True, denormal=False): + """ + Generates a cached random array that covers several scenarios that + may affect the benchmark for fairness and to stabilize the benchmark. + + Parameters + ---------- + size: int + Array length. + + dtype: dtype or dtype specifier + + ip_num: int + Input number, to avoid memory overload + and to provide unique data for each operand. + + zeros: bool + Spreading zeros along with generated data. + + finite: bool + Avoid spreading fp special cases nan/inf. + + denormal: + Spreading subnormal numbers along with generated data. + """ + dtype = np.dtype(dtype) + dname = dtype.name + cache_name = f'{dname}_{size}_{ip_num}_{int(zeros)}' + if dtype.kind in 'fc': + cache_name += f'{int(finite)}{int(denormal)}' + cache_name += '.bin' + cache_path = CACHE_ROOT / cache_name + if cache_path.exists(): + return np.fromfile(cache_path, dtype) + + array = np.ones(size, dtype) + rands = [] + if dtype.kind == 'i': + dinfo = np.iinfo(dtype) + scale = 8 + if zeros: + scale += 1 + lsize = size // scale + for low, high in ( + (-0x80, -1), + (1, 0x7f), + (-0x8000, -1), + (1, 0x7fff), + (-0x80000000, -1), + (1, 0x7fffffff), + (-0x8000000000000000, -1), + (1, 0x7fffffffffffffff), + ): + rands += [np.random.randint( + max(low, dinfo.min), + min(high, dinfo.max), + lsize, dtype + )] + elif dtype.kind == 'u': + dinfo = np.iinfo(dtype) + scale = 4 + if zeros: + scale += 1 + lsize = size // scale + for high in (0xff, 0xffff, 0xffffffff, 0xffffffffffffffff): + rands += [np.random.randint(1, min(high, dinfo.max), lsize, dtype)] + elif dtype.kind in 'fc': + scale = 1 + if zeros: + scale += 1 + if not finite: + scale += 2 + if denormal: + scale += 1 + dinfo = np.finfo(dtype) + lsize = size // scale + rands = [np.random.rand(lsize).astype(dtype)] + if not finite: + rands += [ + np.empty(lsize, dtype=dtype), np.empty(lsize, dtype=dtype) + ] + rands[1].fill(float('nan')) + rands[2].fill(float('inf')) + if denormal: + rands += [np.empty(lsize, dtype=dtype)] + rands[-1].fill(dinfo.smallest_subnormal) + + if rands: + if zeros: + rands += [np.zeros(lsize, dtype)] + stride = len(rands) + for start, r in enumerate(rands): + array[start:len(r)*stride:stride] = r + + if not CACHE_ROOT.exists(): + CACHE_ROOT.mkdir(parents=True) + array.tofile(cache_path) + return array + +class Benchmark: + pass diff --git a/branding/icons/numpylogo.svg b/branding/icons/numpylogo.svg deleted file mode 100644 index bd9b834da3be..000000000000 --- a/branding/icons/numpylogo.svg +++ /dev/null @@ -1,7109 +0,0 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - eJzsveuOJMeRJvq/gX6HPD8GEHFW1XG/CAcLRGRGarWQREKiZmeOsCCK7CLZO91V3OrumeV5+mN3 -N/fwyKyqLHEoqtNZxerITI/wm7m52Wef/dP/9cWffz29vvv65tf1VbF7+eKf/ml/f3P94e7+Nzu6 -vPvd27cf33+4x0u/+tNnu7K6KvBT0++Gr+ST/3xz//7N3e1v6L2rEt894vd/9eX99b+/eb/75+uP -333/4bPdr5bbD9/f4d//Zfe722+uPsNPfvnmw9sb+Oztx3c//Pj27ru7q+s3n9ljQLWH6w/wfvuq -6l5VRTHs+t+03e6LP+BH5ruPt6/f3H433/2f3+yGXTlWu37od21BT/jf3vzp5n38katxbMoGP3hV -dG0Dn+6umgK+1ozjVVW2A37vcPfNx3c3tx++uL/75ub9+/3d27v797/Z7X+8vt394fo7eOd69683 -b9/e/cdufnv9zb/57xzvbj/AZ7+4fgvPfnv3e/j58OMPN7/+092761v/wT/e3Ly+eX3u49Pv2q+O -b97eQHe+u/4Az1/QxbL6av745u3rP3589/UNdHRVtHS9/ooe9i/v4SnhgfFvut5/9bt3cOnPNx/g -Lt/BDal//vTbeQ8je/eOPggXqfzqr3+6+e4NDTh0/v/8TD7pO4M+etVVfdOW8Effd01f7n7127d3 -X1+/3f3h5vWbDzf399e3N9Bh89uPN1TH/021h4998fH+Jn63xLv7d397f3NzK2+X/HD+7T/dvA5v -XjXjUNSj+8yf//fH6/ff2yd87Tx6n0mffXnz7gfo/xuaIk1RXLW7CqZD6//Wj8JY0MfKbtfB7Gl2 -7djIe2Ha3Pz7m5v/+M3uj3e3NzKG0/2HP7/5/2BMhqLYdUUhl//08e3N/V9u3+AcqOjayCP4h7vX -N2/hLuHrx7fXNHDSi/ZbPvHl9f13Nx9gvt+9/fiB1uJgd4FZ8vvrH2/u3U0+/+Hm9su7f6bH/HUF -C6EbauyjYix2A7StHOgOsFJKvRf3oD4RVoBf14r7Hvv5C5hkn9+/+e7N7W/00fqvfnv/5nWYeX0F -C5V+UcVXg/sZ9UeeEtr84cPNrfYDzPr9H9wcLq7+8Ge863L7en/3Drv+PQkFmL63MF1Blsi74R/0 -HlTx8YeXL/768kU9vvrfH+8+3LyHGt/e7Mbu1XcgsW5Ajg2vlo/3d7uyLtwnvr5+f/PqWxieN7d8 -9fXXfA2m05sf3r+B2796ff3ddzf38j94/9U3b+5hXnz79ub/vPrh5h7l3/vr29ev/vzN9f3d7avv -YBlT3W9vvv3w6vNlVzYt140XoD76G7r0+w92S/qo/oPf+vojXP3w6ub2NUz5Vzfv6H8fQELcvIKF -/Prm3fU9iKlX75Ob8pfvbl69vgMh/P79m13Zjq/+9fWbm3to8fvdq/c/XH8D3dE1r775eH9/c/vN -j/CP7tXX93f/dnP79TVIl7IbXunnX31z98OPUuf9629v3r25fXMLX++rV9D/b765fgvi7dX3P/7w -/c3tq3uSMvDF16/eXX+DjwXdCoP06gfYbuCbH9+/+vAfd+8/Qqe9ubt/9eF7EAb2r+tvPn64efXu -I0zU+hVde/0NjD/V9g3In7dvr6EmWH/2DXigd9fvv/n4lp5oGPBNEBD38B388/vrt9/yPeTie9wk -Xk00H6Cqie84udGcuH8na/2EDXg1La/28givFvr6q4W+DLUs7uuLfe93/Knf8S1+5z7zO/vM8uH7 -V3+kG0I1n/MXPucvfO6+8Dk/0+f2vXcf335488PbH199/v4tzom/aIP+wl/+i/vyX+xb/8pvfvn9 -3T3MlhvYe25hqr1/dc03vtb2XLtvX/Otr62Sa+qO65tX32h33PDXb7j2m/BlqOrGvveGP/WGP/XG -3eKNfeYGuuOWb3jHH7/TZ7pzX7iTj9j3Xr/59zd4gTvjI3/1I9/pY/Q8H+07P/LbH6gzftTLL198 -ubAsbP/7V1++B8nvBH79FQma5fabO9Q9frP7Kr/Db278f3218Y1XGxXxvvDl//uS7g4yT++9+/L+ -482X8EER3PRgX8GTfgHD84FW3B9/oPeGr754+xHe/O393ccffnf77d3LF79iDfCL6w/fw1YN0uU9 -KHF8jf+546/A1d+/+Xe9CArcD5+dqRI0w2/w6T7/+n/dfIOqoVwIf/35I2gRD6nqC9wk7m8/v+XH -vP/4/vvdl3d3b+1R5QPylj0xbKr8nZ/NTezDuRvAmz/fyvfXsAPCavrh+zff5OrPvG832vjuQ24L -myj2eu6O8Vt2s/U3fh73wY7+9s3ta/gKTfzQc3fvfsAjzO7P31//gJfxk0f3yYc8/+HmWzhAuLGl -q8vtv9+8vfvhJly3KyDvd//j+v6HB3XOj+++vnv75v270Cfuiv39kKpA4bt3j0P/hP9/i/9/0Cp9 -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 -AP7DY9wPhYqcPb9uQOldD+g3wNLF11u/F2Ul2Rkk1s0RVWIPKcTyRfJ0ZHm0rNgvuXd6+sM7m7AA -4zgOTkfr48M3YPrx11uPi+LxgaPOGVP+MkkFbhMaLR5nqcBtRmef6zQ/hkrtsV8mOZDyOJ8rsF/m -2M8pptuupduuxdu2xdu+nX0+Yd/Kbd/Kbd/ybd/ybd/OPj+/b+Wyb+W2b/m2b/myb+Wtfau3fau3 -fSu3fSu3fTv7fMK+9du+9du+tdu+tdu+nX1+ft/6Zd/6bd/abd/aZd/6W/uGJ5AvbNJd+eSVUV45 -5dnrMqD8S76x5XJhwTdYvrHl/Hy2nG9sudw48BWYb2z5Ns3PseV448vpxoKvwHhjzPFNzpxvnLnc -mPAVmG+c+YlbV25bV25bl29bl29bd/b5PM4cb6w53bjwFRhvvPlx6+pt6+pt68pt68pt684+n8ic -8405lxsfvgLzjTk/b+v6bev6bevabevabevOPi/8OV/5c7mx4iswX/nzI1qUm7Ybf+Z57rz4Bms3 -/tyez5/bjT9vEzLh8wZsN/58m+bn+HO58ed6Y8VXYLnx5/Imf243/rwtP952Lt627uzzify53fjz -NqN827p827qzz+fx53Ljz/XGiq/AcuPPj1tXb1tXb1tXbltXblt39vlE/txu/HmbUbttXbtt3dnn -8/hzufHnemPFV2C58efHrTNO2q78eWeOV455ZZlnr3NA43L03amM83enNn6Fagdfb73O8cptvHId -L1/Hy7fxzl7neP02Xr+O167jtdt4Z68rmQUL/2My4mPQ5P97dnUeDmOLgDLDuBKmBr+xaU08xZE8 -xbYfTG6v627s6hM3uMFuasYKI8Pi1Vb333gBf/ndi86XaV8NGFfDk5HmzdxwTjw9deLtMvGrBn+1 -vJTLxNtbE69Pnbj3l5kb8NvGh36Z+tnnQi2nXfZzkz8NlRuZ5wtJ32DfNn1uhJ6eSujxRunf1uWv -Ztur+W+j9efM/TRXbcT+bWX2arq8msA2cn/O3I0045Xev63PXQ14D71eKP458z9tQBvFtwt132Df -tiptFF+fSvHlRvHf1o6uFrGrWWWj+OfM/bQBbBT/bfXgahK62hU2in/O3I02y5Xivy0hX60iD71e -KP458z+16o3iZRqH3HIDfltT38UZdSc+h+i3yefr5E14uUK/ra3uQs1zpn/qVhvd7xMt1+lfle2r -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 -e+WVV1zee/nLLr7oQjAe5t0955zzLrzopZf2rth71b6rr756376r9l7Ru/SlF1143jnPqTvcsfPs -c59/0UtfftmVr7z62onJ+Jq45upXXnnZy1960fNzl6Azz3reBS966csv37vvmsnrCqW1Kq6buGbf -3ssuvfhFFzwvPTk+dfcLXnLpZXv3XXudivfWmKrUxeS1+6687GUveUH95B1n7brgokt6V0Kzyljn -vbOmVJPXvPKKV7wUOpQ0oWefF7u7/KproJKmD9dff328xDY2vPqqyy59yYVxhPLY81/00ldcuW+i -KGOzG2549atvuD44UxbXQod7dvODdzzneRdc9LLL9l4zqY0LN7z6K+Pr1TdAvfDJq/f2LrnogueJ -5X3X818cH3vtdbG761/9la+Jr6989fXe6Ouuueqyl734+bvOknYXxuG98tr42Njda1772te+5jWx -nS2vu/aqyy998YWp3bkXvuTlV3C7r4R2r33Nq2+I7eIAL48TGdJfbIjPHeyPxnfNddqk8d1wvRsY -H863t/dqKBoern/1q2G6sbuB+cr6xQfHhbn+hviC9dPX0fqdLxsn+xE7jA2hoHrwsMwTV++F/Tjv -7J1pf59/0SWvuOKVcePKykLRelvFg9C/v3ReXta7MjaEQszxVapi4ppXXtl72Yuz8xLP364LXnTx -pfGYXjMRKYSKx2/y2nhQe5devOf8+vzFDs8+L57n2PCqfddcOxFf116976p48C9+0fPPzXMbwm2L -1+jS3uVXXvXKffH1yquuvPwVL4vN4lOzi0TX8kUvueTlvcuuuBKu22WvuPSSl+zBZvnFxIYX8P2N -r5e/7JKXXPSCC9ov+q7zn5/wwYtf9ILn7951dhviQPzy/Av3CH7Zdc5Zg83OYHy169yIrghftbfi -lmc99xzEf8+FVsNR5Y4dgE4jQl3fdWDHjlEQ9JZfz2r+diO8UbsG16+ZO3E93hb4zkAF6YWtrUEK -SsgjV1tOWizsC4wq1jPv52oROCu1s0tduUZjKBeuHVaYT73msJRNswb5yaCIc039BU3lzRsPFyCz -s2mkWeNsSqnXxszXcNhA7bqC0uNFD5XrvrRrsq1q0rvIkZfAogaVs60erKw0Oxci21qphrNG/K6Z -LCJKXee7NrK8yrJFEIpIQ5Xj0R63fxOP81yn+tljFqS0mpF5LnVPt2dQyxoBiBrSvw== - - - 63PYx4XBtre+9a3TpvUjc+vbZ5f+7+/90A9/8N8dPvi1t9m+T9/2b/7Dj//cR3//Ew8//Ik/+NX/ -+hPf+y3v8NnH+4/94Ec//ld//7+e+NKTT37pif/1D5/5xK//2Ld8teZP993+bT/78b/PPR+//IVH -PvlLH7iPsr2dMf1tv/DwY/16n8//1a9+11fhxxOHH/p4i+r0iU/+1BHs4DX/9sOfeXLw86f+5y99 -643w+WvX+fza5R9r6/9x6f+MN3/bhz/9eN/4vvz4X/7Kd91G47/69m/9uT/5h9zR9MnH/+5PP/L/ -HSzS+rznh37143/1d//0+Bf+5ckvPv7I//zzP/roh/7NW1S2vm//5g8+9LO/9Lt/Gtf3dz/yn3/0 -A9/0tfn6xld1y9tml/6v7/vQhz74bUv3vO2W9k30cX/f7Fo/2uzrtCa8rcR2JFw+SGZDP8ldi+I2 -0vK16o76PtmU9ojyBW9Nf0R9bE2DRIn5tqZDWisz3/qAiWDKoI0qfO+6m+Mm77trZWbpCGQavj6+ -Obi82DsylwhHPGmlast0vKmu7LCeKENgL309y7qcHr9GG7t+E1WM0Mas30aPMBxts3uKqQ9vXjqy -OrM0O3cAcMeBm2+KV/fwtq1qmto2dGW2rSu9fcdmcD0B+73ugbnZo9Bxc3VPcAZscxwTVeohiSqL -fgFFJ9w6HNeDltNNRoYeeX1OuF2DAOlYcif0+DYgNoOPHbkTquxvLgZgJyM9sM12kds2SulGjzUQ -nkxfrkHQjVPkXCc9VvSxkyenv1nskRFm7bLp1T0257yWn/mrerVXdJO+GR3xOCcDnTA2/mFso2uj -Ak0fpBOvJysb8XR/6xAmrXE6aw0CQjlpnDKDrWPfKhQhbx371joSqLg8A61LgjdbR4nEFGqgb97J -rKGKRF6FwYaQP9+M2NZVUY4k37+s9ZDFyA5JvhjrSEv7YtMo1zo/aqUE1bsJnITBWb8AJ06tjPW2 -h4Kbqwz+DgUuKHgCKQdvdBHnXba6xUMe1lIp07hACQSOoZUlj14oioB1CWzkM3ww9THmv/kCwVdM -Xzt865s9ZsD6AgnI4ONK08t7xCgMVZh6w/lvvkAywqxdPZesx+acaZPQYDJpKx8aK5FAUXq2yhBj -pCdLb1CkRqfudADT37wS8JXSN9vh20I1esyAaSUSyNDjiJ2SHg0OzGUrwX/zSsgIs3b1XLIem3Ne -A5Vw+RGF554iVoqitOtErFRVZAgnKjOpQ8QpeeCH9TI9FQeji8GQlWoyWG/W+7ZxkxEdi2t0MerD -2Cm6ipcPc1Zv6Ftm0usCaMDa3wLP/BBPOn9LT7pQFes+K+5N4azu09JMRGzoStCirfltyMytvdby -zHIyGL/ul6KIYEDVKJ7iQIbWXXlQ4RlvQr2UKqj1vgMqKOPqr/iIHtZ9kDOTzho7EFc00gGBq+dd -nz+7KENvEvM5I7Z07RMIspr7eOVYHorzDeROKbgJL5/8XRvTy6Cb7VxJaC/vsQZm1z6BsBuOmJMe -K/k4IRz+O7kS0Aizdtn06h6bcx7Rgl+ikhoivOAX+pp6wANWxQOXVYQxvoxiXSh1fBt5DLQmIW7Q -fjLSKoxkkZ2q36UP0W+1iGuHg6NAk1EM+6OXrGkd4HEpWZNVABjVFrDmKq+jpSh6dwxEwt0Im/mm -2EFZRg56N5HTwtqczGUgX1I4EWnR49tANBvqQ8neFIXJgEnfr6pSNRoDQQ4lAutuM6Ac+hwE3XBI -qPRo6GPbeHwCJo0/jTVvnE207rYx+1GLb9GeaD66lgmg08PpHwTaRD4RxMH0ps95JVSGz7gyhogL -qqw48LH9mJPSu9Z390c9AuxNICvt5poNmSCTimW1iELtQlO/oIFfbxVJ2oSXASGHdF5t4lCr4NQv -YOHXW0WxVqGtX7jbe+DQsFUtWGYHsbU3u7x4ePno0sHekftmDs/1FpcPzvVrM5P28malbp9ZjfL3 -0m1HVxfml+Zev7xy5+EopM+tNL+zMVn55qVDy/0Ccm7Bm3TM/Vvg6xW+KQzSQOT9E4s/wPCvLU2j -5axA5j0yBaG0Yg/M4FEmqqg2Gr71jDUsRybi95zJgFMSJVjYKodPE9xRXGSjE7D2hf7HZUAe21Qy -NRIcn6GN9FzD4RkFIZD0OPyYsUoamwCnJKyQ5yJw6rmeeNZJvUTZ4zIgj21qyDpPI4W7OtOE9F/t -CSyfYiutqDsdeQLenggvSuUInhZRAy/IQIzQ5JiQUJkMyPg7ConaqmZjH7lJYyoCGs3FVny8USVr -kSN/m4yubtKpohKtLpmHI1DMtvHewpVsAiHou6zqHmobb5T/DTeugmKgBrU9Ab2mIjURDXsv3FMc -W8TSxNZMRhbC84DL4IKgWlUxMBiNCQMKKqjHPYT4Peohrgj0PC1wF9AUGuFx5xyvTwgWUxHEj30l -FvEiVJqAkRGz9QpHPO8Jrl0l1QiVR7U+DMgG0bGrUHkCGngW9xDFEFiVGj4tcN5oeGJZON59Fbzj -AZdWMTAejkDA0tXl4dRk0MhgwmoUlbBhwCnRusW1lFo9hda8mHEBq3p2lUGjBfQV0ZKMLa6iFRO9 -gohdnqDysqfGi4WjKKqKgJFYZzsSby3DXSEH0waUrOHkK28HgKWpg4NzuKMKjlDlskDyFM+lkgsD -C+UtASvt/3/23rM9dSRpGH4/z3X5P+BMRhIZDCaDMbaxwTlgAbLBREsws+f+8Pz2t4NCK4twZs7u -nJ1Zjy21qrqrqyt1VXecWBviGCJQ8optYwnpWZKmJYoxIpOID2XywnQqTWPoVIbFpRGnxauQGLBK -ouJDsKIjytRLDA/sGzgB+GEySosPo7DAS/sQzZoIIQq3Z2ji+Vh+zoTFgQCewgIRCDgqLq7xaBLT -Vy98pMgJGksUa4I4XtETiXJUGK1o6XlD+xw4b1FaYWQJDH48NoEuCsvbbceor/jPoKs4YPmFK+Aq -zqZTrreY8VpN7F3+dD2MFgMtVcpHgDKZqJ9HYBQyKa0yIA/oaDiMlSjgH7xIYvC8DQYr0bB4Tgkg -bJiKiheJAqefkRRSAvuGol8fkRYUjRKs43HV/alJvBEJV1lS1u+QneO0pnFY7gINbOCkVNgfS0bC -ui7AtUElxf4CvZMUISTCknkQD0ckJyQRizEiFUDDorzM0GOZaA0TYmL+MbsmFRAgDrg/5jQkuzEf -or32zuVs2gTYFgBhILBDXLpFvtn543KO3iXwu+Z4CX5edb8ApwIGxvt3BX4pDFwX7JT95HjXFXCC -AQ/bvHTht0V2PB4Cx2c+GPbEpu3ZbBxyhV3zhesG2sUhg6YeVwDCID+IwQ8qY3bhMvpA1RQY3aAt -hmGKQv1FFH5x9Sc7VjfFMAw+YCipO7awMYwwpcUAJvdqCqz9gao1kBbjkavV44fd7piT2mIYpl/w -vRk7BiKmwoGXHG+MAcMw+Ko9GE6tO1VZ9nFXMAzTdmdT0PU5cmDMAWIYsPkFy48AzwQgH3wOrLtw -zwKgvdl4Btu3xbEMeyNXyOMKihwMuF7Nvz9hLZhMM2R5zHaI4dCf6AJM+C/+v+LYU9ZdXhe9zMMi -9ij8N0rBf2PoX3Hj7qdgVxYExg7+ZvCYgXcQiUpj/ym4w1q6u6Iy1WGwi8G7vz8NPaUmPIOqY8DP -OCVOAv0TB6/IRYwdnSGCGC8ABx5wPPptrxSjdQy7qJZwiHeASJeCZLgt+MxFh1zSP5B5Qi7Rd93C -KrLomkaUmneP+Ue7B2W2ed8if3/foIow7ZDSnSiMWgL/AMb24P4f3GwOo9+SwENIiHr/7+gwoavM -CRn/+wmpVormXUv8/V1T62Ckfc37FyX7Bxx0MNHAo1y1m+sIpSR+J22jCDt/hM6ns7+m6C9oRYuX -54YuQZeh5R3KAxv7T05+HyqKIdvKcAxGjD4Ba284deEm+DFOhgmJbfzGn7UWLKCS9WcFVhj2VN/w -sxFn/RGD/hhf8WJjCMdyxyqEG4pjdDn3HqVc1FCJ+3ClXTt/uNwEKOS5pF0Itwv4Jq5QE3q7RsMC -/m9/OVyYjcj6YzhYGzJaDx8CUAbv4IRHJznBBE1k+IgicuXBrcCV/+SmV/2+OaWsR46XJJkJTasH -7kbvyh8fYM0E2eEcMDZeRrBQQWJxt6TPXKH2cDF2wDBw0zQcxfuYLvcN2x8uhRVm+5/qNgMDccza -3S6MuWl/I0ZDEFZfZgQrKRAseQZ8I6d34pcIhLG0Q3mYkd8y798u81aVcE5SDBgxmYuBp8UFGeCA -xIOwMAxGqaMGJ5KiHem/T3SW+Nnc1Rqw/dlfeiFEvDQXQioITgWRLDphqZo0MrQr3BP4HnoAHHOx -TR8YfegRLbbpjqd42BRMLxVbzeZsT4KEnwxm/P9J3+En3fESbxUbzH4wmUjA2DwMLNPAAqcZ9Es0 -kkQlLGJyJwX/C2cykkxQ4eTmqlHojXmpk3hq5+yQ/yeFMhhbxOF4/g65HP0tl39lubzmDPyq4nzT -IrbtSG4TYU2UCmlFtfzKVWZ7A3NpTVYbOZTVcs8X0rdiFg42HRUJLPTYMVfrNIEbDMimHjXPfYyB -Lftg+PRR8xSV8KAiGyTjIyoEd50KizYKSa0xXU6Ks/mQE9QagIdbSFynxH3ynPgOns0coWIxqclk -9icA2VwI6j4gVI3hVAsRNq/JzSOUpmuasat6Ac1tViQaqbhEshGjioijmg+nzdlQBPdrexZhQNRo -wqln8T8tQuwswtUPoPj3CRW4OfFTpQq9TZlCbUWYaMfsXJrQ/1OihE4Ekwz96wQpdAe+bNMe/veK -wbXPmfwtDX9Lw3+RNAwmfiFpqD3X9bco/HsukfipMg/ANhR45emf3Hg251xAVrjuWX5uztbwrXOe -lpYhRqwMBqkDidXxy9qMH/6f2cs7drzEX6IOpFx5vjcgEglLQ2E+Zn/gP9VyQwQgRR/l4BtKOlwl -WPILq43YT9YawHuJblNx0PComkh8K+pD1zPnnnnsf0p/MME4E4n9KvqD0l+A81uFbMWaXuf2u9/m -9G9z+h8yp7csV+i/xy79NyXe/K9JUEMj3OndwP9eURn/yaIyqMHwi0hLbaccS0vteLZrP/5D6RqR -YBweF2Kbs6F4HJvnbATDMSbsLHEDHssFN1OSUsI0LdYD4sxpWCHIRKlkQjmciwpGcYrH/2T+huYK -75+jDP/+Uf20Qa2elBL7tyel3ECGR8eq4HWFixVUvzDiCXlyMlUMP3nIr7Lk0H07/5PZhrDQHfwv -LuX7S/XNv3y6dbjkwmEKvQoKl8w1D/HZCtYJUh68WArc5DmBW5xzP9RKowdQ8CxQ0cKcQ2tRLZCF -weyv2rDf56atJf/B9hTdj4Fzf87Gf3L5/wyFC+n4GQpG3WU1NWEXHYqSopA0PFuJfENLbyIME1O9 -YTRGBnwWllrDs/CIF7RBYzos9iYCjzghXjCU+CIcScZVL2ip/wyt6iVjAJ4J65+FKQ== - - - g2cS0CQTVnWDlodO0QkVuWgjMIzaoUTPRHIoxAZz/aAJ4YFH2IgM0KTt9eSx56CAjG08/BwsmjPh -Sd0x6fGDRNCk6k1pyD8YfyCatcGo6gXgKG4qDBc/JHBhLbhHiWSJqPbVk7gu8QNKa1bw7ERQBns2 -HS6G7BgY0n3RZpXtTszl1fFM0AZDu1ghcnNBDVxcA0XxUGlpaQjATuTkRRFWzDtpzUw/RSETlr7A -uFXSRzLh8/zigtVi5v6z4Jd9GXNEO4oL6I5obHjUKwmSkicsgipx88VA/cUcyg0e6Oj5bCHjl7rV -gMRWPw2XgI0rSGcPqIQ3LQnvJDQ7ZeG9DbGNxlWEFWTaEDYmRX7SHRI+COophySqityqGbr6+AAS -U02N4fTPoTAErFDlZpJbIrIH9yc3rnGQIB5ZZmOquo5cBfjWcntFnlUECHwJuns2/WeN4fgvZDbG -f5uNv83G32bjb7Pxt9n422z8bTb+Nht/m42/zUZ7szHx22z8bTZuZDZCyiSkvRAKkQadkB1OMgxJ -PQaeQwJfxX6bk7/Nyd/m5G9z8rc5+duc/G1O/k+Zk0nSnGwNJ/OxYk7K1sJattZ6vNcE1urCsuvF -McfyrsISnYn4L7eFf7XjIKy7/69ILbRLzg5HUZohHaHQpTZMmInAm7RcdDBC0X9zmePPOC7mp8m2 -1TwCdMitqzjjp0Bt6r0C1WtzB0EDxXGdnqLz/vEai1/gWLUay09m0x+AjuMx+/lbaP9iQvu/RBzL -olRMSnbRHpeUHU/J/zwTAvTVNf/nwhZ/h7Bl/o7czv8ijgj/6zki/JshSIaI/WaI3yJCxRHxfz1H -/B0Vt/8+G/dqDsz9s+mY/eG6mC0FzlUCr39bur8t3V8m8BChUOAhCa9/gzdhJ2OucDQYhrsk8OJx -SSL+d4Ye6L+p6PdfxjOxJDqYJg6v7qTg1YNxeE1OMshE6KQLXl2Z0F/E/F/FNj9Td2yfbXBoC2+g -QItmoA9sES/Nw1oqCI4PDxH3d76mi7l6j2YyHk7UT2Yfwir1rL/KcjBaAuJZGpEYTKvFVeFUMvZz -z2b6VzJP4n+WeehoGBrdiHfCicjPFZm/7XDJDr+c8RN2/NsG/22D/zL2FLza9rcN/msYU/8tPPPb -Bv+l2OZXN6N+2+C/bfDfNvhvG/wftMHxhad3w9kY8Ogl9/sGUcilQZgbGYkmEoyYIhWEh0/R8Hj7 -KL5sTH6iL1OhwUTSYCKpYCz6MytV/k5yJOF5XHBEkTgVTUo0oZIJdOR/RHwqPTGnCf2/QxM48ISY -UIvIEQsDcw+eUBamIJOgJ0mGjlmQgwn+z1ADrgo4eOlMN0SSKLxqD1KCkUqYouhCbAuShGGizP8G -TaJyij9ZuSUdY0fHY8ixpPB9hOBJOM5EoxakiWyTLlsykv5OFpPS2KHgDcelVYeuXXeRMgqvQ3M6 -/lT++pfnCf2N/BCWzoqM4WM1JKUkPo1I4lh8Ys4Psf8yfvivyiT8O60USQdJMgEzhCRoI5IMFp+Y -M0T8v40h/g5++JULpTeIm28t6vBvcBafwXN2OV682hWiSXFS8jR0tEbFM4+CMeQ+oV+gtQwNR1Fw -4zGuWPxvWpB2mD9LdsrTfp7HVY4CehSFjzqXsCIcfDCcfgYC4vMC9zmcNlngDC84PIxmd4V+u59v -AABhwaN681cPIsHD/0HSqV/s/NHsGZHJfT8YLjjptWNysYjhgEstf6l8IVmcMXRTkXhcgOSxaX9B -kICc53szdiwDE612aLUCIxUCiko+DoPriMT/o8+rPDtXjULCGsYGMfxFhEdBQY3canGg6v8icHlh -IEMKSy6n0m9c7YgunhMNae0vCEprAmS1DEc+Z1o8kgsW30s6I5hIRmga9i6OLXLZ6UeAGqiiWAYk -nVwdkUYSl+svJcIn5EHK48dtMLHZ+bLXG05nyiDREdfk1MnnY8vDjkpYwqgRrOnEvyCYF7PegFUD -jUiUlVx45fTtiDReGTGDHVdIJ+zQY66Y9WZjlhg8gzUq2koC9rfkx4g9kvjyguUF1w3XV2gWg4dV -iJ9R0sEV0mlo4lc3y+4PZZUYl0u7m0ueI0FDYmMjQDpjTWIPsflkPhpOidYx7JdKrcW74cXmre8l -q/Cey/L8NndrORUGw6lCHMnlg52HNI+5pExm1P6RG49nfymkFPtJYw5U2sG1uOA5mKVa5TluSiwq -vMDFTyLY/ZG/q/CcMACfsIKg+TAmBS2UqKpCTHXThGRDUxgZTbC1Et+Q+QUTYs6x/ASekS9DkTgj -zETxVbmAjyUXDrh10knv+PvabDz+oelHUrbhJBOPWEo0eOkizkTBWKT/4j5xrHZkEtvJ60gSaJS0 -UOSyaalJFPOtuGr5YbfLsVNXAV5lJsvruIiclsKEtChDRGdVlIRxOB5R4l9wfSAseZ6d6sAl0dco -kiivDuQR4s+hKYvkMZaT49mAVX+fkMgVx11X9I0y4+oPJFGg8rHpMPwfGcZIYGmJicvOgbjXQZJ4 -QwWJEWOqxpDa7PT/2KlK/0n0TJCBx7C4noyhFHhg0g1ZYAiA8QHLRGF8aWYTBDWDUUmlGALDgXFF -EUp6IyGvblIpG4LAvXBd8b3BsK+VnVCRY8bDC18u1Zdex/CM4DW9FAAMVoQh7qEgg8HvwtqfsCeM -dkzUjRUwEl+I29pkKxe6JGO8EmTpG1U/WwuOG7uKP8bDaV+yhS3gaZqrQCkzfAMMvi68EMMGmv4L -DBDuQ/DA+m6NfjiqNSHbixCq/LDvAnYz/K8zGKovLFScuzqeddmxS9ZyeOWOIAjNG3uNJn0iKjUd -KLWys9Be0geiAtMB0ig2A22j6j0Wy8YjU4vsFWWrBMlAvOqwWYhgcxGq6qoxXK2Ahd1b93wO9yX3 -lwsd7+Jq/cUuegMXLUJtFhSnRnZdFG+G9HN2/rici04Reie5RQ3gmqj8O8OdwR19efiO5owPw6w+ -05IbvX+GO2LvohkOiqbwy9aPSXc2hqD+P6gXebbLCd9LzhVwgTcTbsEPe7hXheViARYire6T8ljp -v/iIIR6dTT9maGj8Z9CFzDSAoDibTjl0bZDUIzAMVX8sxiZOSmnWW0646aLELsC8H3ZC0gPoXsM/ -iagBevBw0bic9Tn8l3u/LzYnztr5z2Q8BS0C8AfcckfhgMOOcYM/5dtZDztJMQ+BfL/4MZdeh/Jg -0Rh3A9CZ7YMRbKMX9Nq9+BPYaSxgzBYHz2j6RXrya3Tk76ZHWmkFrJhxn+emUistRxNNgbcNLO3l -Qjx1D77zGw0qJbAwDAXXzD8w1yuMTdNx+JmQ+tO+v+6jqdABcyekTdqSXWf+gWlRhmI0Qeilw1H2 -lsJiNvm1x6n+04pT1+eN8aw3gmafLdGmsyn3q1JLGoThqmV5sFgv0UhsB9kFngBoQP+qAyUH8/N5 -Y5X19OtLjZ9Csb8TGml1ScoD7yQBI5B2NcUTJF1t7j8LVxl4G2x3OJbO+TzsxKJR4NFg6gM70AWM -ye6M5fuuHjL4aRcvLyHbpp/Yo0KNo0yESZg3Zgi4tk1JuLad6CpcZQu4q+dA2A5dbDpnwZT0fgDk -wGcWpMtHDzuUirwS7V1DAUWoXeigUulYSdPWoymQTbPlAkCfLedKW7ELoKlseYOVvZy7Guz0cwnc -HldzNpc/CCs3NMNuXy0X8yWMMwjAoxz+H9rvAT466BjaX5PYI6r66AIGa20+cT9DN3U5Id68Eova -qL+VMdysmHI8ZkDgximSgTadEj3Rkq45OwdQhOFkOWaJPulWiXRRKgAkwYlLk9qfD4Pa1SHMZwst -PnY8FLTPJqwwkugtnyE8Z/t9ZQXmz1z55WImk5EzWImU60MmSW88nIMBQ6vxP2AdfIJhSGjjCm+r -PuER6MCfyMNzAQ+fnfbs0EiHx7pmf3L8HDp8EpYIMQPiTMGZvF6yUDK4Gvi8VB0Dk8AB846HU861 -AGLFph9SUwFlLQhmE6gR8i1uXGMXgK3gycT8WUlAr40Vgty2MQP+NWQ1VWuyRRs6IBC1/C5Ebn1r -+qXbGrd/L63ikCKrQ71JUJqM2WLA8R5HTXuTHxLnKYuNbMv3eSGITVZlCjCD6ppJ0yEIFshRS6DE -AYn6msVKNvvPPNibTeGdvnhKLSAqTUlGiZo0BYJeI3qQiDNqyuuaGo59jkduM27QCsgoTUNCumrb -wvOOec4G4piGS5xdWLeCbQAoQRmHScMp98nKR8Qbt/qYLoL98Zz/mClLPWY4hs/JKDhh+ZEw+/gI -LmZz543H3AcxIpPWgH+4vhq0g8Zq0HoawMZITXRZ3pL2sCFPJD3YtZ0DxTqEMTWxXVA5wVrXts99 -QGH217AvntUN1CPQhbfTYQ8YaEarFH32NesuYP3NCp/ghf0xHFtNOWqpXrGGlO7x/SBUA2N2HvzT -aUNpgLTxSoBN0YXlMkTbhhLEqJHkA63mM2FoM2OwGZiCuXztN7Dd4mYNZzws7rFjgt6YD8o6sou3 -sywbS9JPPpXduCmY9CCCyQrd4WLCag09w7YzmxmXG3ZhjqQd+j4nDD+nGgIYzNB8zgcHM+XMdat2 -fzlsN1DOYweGTcJYAoB2wwlYf8HubKHosZiJ7JVb8wRomrFuqwghu5aEBDLSe7BhH+9TOFvHwmIs -LuP53EqhwnYiYKWhA9ig8QS8HpNut4OvIPdw/FRvkZv1CX8gewNELp4FKiCqxxwylQjb34GGUTEC -Y2wiwf4MZY/XAVCSX9zCTbXgOisX4Y5lLMAEaZuBQJOMXJZG5AKNJtJ9E7azgOwsdjqdWek7bLYt -pz1rL8wCDTCTiEk2MaRm8/7SroVgC6M3s6ANNALHQ2kRxo2EP2iidmpMzSUgIadWEwEadYfQOpfM -OBPrTO3jGNpSwrIrWMkDbG8R0+7AyFFxt4P2JOOaW0X8zEq3KBBttAXWUjrL2hSmICf4muvqxXCs -hEMMVw6yDnpTwWqYuNF83PthRTqs8j8dWDig0cAKHVDyzpczJJ3NQkMKEcWV7NXrCqYlaE4gjidN -9ZtKF8fM9SCJ3HDaQRuVx5mW44wwATovtXQRLvY6HjMkKVQg7MLOFuI5eOUNB+HxFlwGmwqj4RyY -d1NrrxoZWMAaAJP1yRmOsj7rwi14coxk3IZ2lZstMRgUusMRm4JpxAa3vhJjJC1VjETfrghDR0Ux -dHSjCh05idJBEFahOXIYjCt/5ngUqLH9IFCzjcaAINhEF5Xg4XSmBL9cwykKukEXQ25MBkNF+lSl -IwHYaV8Mj2oFoh1HRwwYcDgdjYUFsFxGYSgI5iTDGgoD5QMqyI4XQCRFZAeVNjR5lC8YYLopt3kB -ujb5WY8TBClZz5DxyR4ableb4YJ+EGGoRAy9Z/IDVr5+y3bstDj2sIUYIFsPBSJs5pCujCPYeNqI -XSkb6GHNrBmZsiRRCMh2FAxrKWjZbRVJjMwh1RiVXtARw5AaSe0Pnvtewm0SR9AZHQ== - - - 49uiYHQoHM5peDX2csYCjI4FgnGblUhrVqKRbiJ7r6WQvHKlrEfb1ai2RJwMPuJwpYe1K91uMWqo -ZT12epUVQK8iQxit/LSZAzG845Aq1GpUCWP/22FXNBS0UCy92dIh1LBmgDB1125RqZnY4RqkHVKQ -1lLQWlTSq4sRykiMWKLQkMimtfMpZfSQnSgR2iG/kB2hg3E74CtNK6OXlU66zmgl2QUwrqeq9Ewz -sto4VWTXVlpUzuUMtYqcCWt0jzzi4g92ajtcag3JTTtdAOEVFwClM6Qsqb+K1cXoWdpJc4mokit2 -Nh25YGIz6YWpEiKwq9CADkmex9Y8yoHRWfPqr7AT4OAzte+AkDlwHShT16+t2klXO5NX2h18WuOn -6RpQZs4ZgSZUGEouTL5VPDtLREscDDWgt5HTq6Nn38l95jjNPvjr4aOrQCHHVyeD1Od0t17Z9buP -i0M2KBzEbmvl2H4qd1vNXkROU42X44scv+zFK2XmInFIRyL7FCWUvkqffuogl34LenMn/rmQE86Z -EECTSzd2ealVfVH4rF03cicRrlUcZrK9UjB4/KnD1eg/AoTxUuUwFX+qLkpfr4XIU8Cfn8waQv6s -tRj4srH9ZaUUObgvfI2P7wGa0gdV7xpCO4gnP+J3188v+XYxeGeOlWyXes2djCqvuZQQnPhK/sNl -xV3tfwA0iF6V987VsvTxeh8vjHPjh9RHYbAoDuJPtIoi70elHt34zp2cHt9jQKDTQvHt820Gfjv6 -Lp31z3YLgcTXQb4V2J/iTjyw/SVAk/xy+3rlXvTaXRxEOumT/GH4yFe49L/7csXj20qRW3qzd/X9 -QbrXY0fwt6Gv/NEYYNQ0FWLj/PDgPTV8q/cL48PT4wDve1nmG62jbzgATy5dH4QBmlj67jWXn/aO -J77MRToUn7xkhvF4SPgI5/neGe0bpWgZZK9UF+4A5eLHXPw+TPVTw2KIBZNMX2TcAT9XGMebEzyG -x8Zhrnh2sn9f9iejsCq+dPYc28/Gi7M338ld/znFdPdfEdzs9BAMKRvz7sNpeY7dx66nkFTZwsgT -C4gMetdvUPTr/kUpxJ4cVXZ9TzxEE4Mv3hAU1ASgobp7ZxH0hy9bORF/O7kvn+P2RX/5HUNjHpkz -wMEPlC+bLfuZ0ulnRgR0nzlJ978u39Bsyj0G8K4KUQkNaFWoy114VbpAuzM3sBUXQc+iu4VSB5G7 -xAmnkdhT7KuXb5e+fKWP0Pl3mWWPDwqx7u31Sa3Uyebbg94i3zzoXeTbTBiyQD7++rgPPuo/lR/e -T5cylTDzqrj1baRAS4yDfE2atMdZ6aNV7iOSArisx5fdT9/jWYKQAZpyh/bdFSIP9UqO5we3kdTF -/SmapUR0yMfADHr9vsIs+aalpnroJOklUuHJhaAAmrQvs3RXSmO6QNWjKfCjSg0xoGysO8ul24u9 -fLu+WOqpqZlNgvTS7D/wu/BZG8q07+AwryXV8ibJVdxHc09xELt5KnepE2+J43k/xTUzabknmCIy -ORrVfKdOI547CbxX4JI9D5bOvuKsKAXwrCZa35Pz/NVb4aJS/KgnKPq8268U+5NHJEkN5qFaGMcy -9wrw2KKReSrU2vsZTScAGtAP7qpUHR1yANf1CRQ2YeojdT/T91fbrgd+8y+q871uMulLRy41NEmf -CbOP4lAYxpDoDDw3Gc/+WU0ZV5pLHU3Amr7xQCa78GXqT3UJ6+cLkGlh8Paw4a0uOv1JvvVeL4WG -kb0yBvBxXIvl2xezz9xd+4ytlBPXDwBN6sLHEDDgPEQlVXNTqXQ8uwPxc+qdKvfY8RBJzRP/42k1 -H3/bFfJUdhlX2pW7oeeDfNN/+oy7CMU0QIMkNdkgML448e8PH/Lt9pGf0EY01V2Wj6fNZ3luJr7y -3UNNUjDeo9JHPswRikB+C1lAbFAelOq8913/uf81dh88j5c+2nysVPc8tKqH1XqEqrzkwvDtDCiz -z2Ul33v+ACu9/w2aXD0CHjol3sLRpPI3e+hJxZ2MecoB/0ekVLg4cssCy5cK8eXd+M1rPwl4OZcD -P4pl+AMuskpe+i0O3xaz8FlO9awCS/xUH+Gm8pfFovwl+q2JPpI/l9tV5B/FCvxxA3+UpCbxJEZT -KatwoVYEIISmpIehdF/5IlOSuoP7VERQRDQFeaRZuVst6RmGVpTRNA2olDfDeoKoIxINgiyeqj7P -wQYZ+CyjwMjLjXMyIa9VRMAkvZSh5InRkLNlNb/OJ0MzEyIaZTKqMr2K8rOsTCo1RfC4lD8L8oAr -mk6IaOQJ1YzGwbSgb/FvFTVW4k+Mxpg97HmjoRqXwi86zsVoTOmFaV5QUYQYdcuMrurlWawQDK0b -qfQR/k2GoelORcPaWTVWBC8nzo1CkYp+ajH5inIvy5TxksGkh59l5LWBebNCsACG65jcDpkGUT0r -omnKH8mzT3zUkr5cgxkRa+dJFijK2K/k31ryQFD3L7F9cjoQllgRLhpnVzl+cXiTby0P99T6YwbM -fMEde5qUJ9AcBNZRPTSYHcaoevm7CCW/t9QrFifAIi+MgC4eRgnvg04C7+O8EDsGBpznmrBU2vWl -j9SBZLtbaA6ybNTYjSKtqMwTofRk9whpI+QgQG/RD/T404lqSNR+7u7YDYVNqT9uvFZK0SdGgyae -fmpU8tFc6LZUc0/38+ePranqLfsS469rrdxJIL5Xqvv2oyqnEDig0O7SGLfAdSRpU+h+ljhvuaEa -K2GB+IC/0v7ON888L6UucFQNAGAfGVnTAA3uG/S4osL0poCtzsU8eO07vWO/JTM3wW5i5iKrU7R0 -IbQWsEmuiovyU//wk3k/OS1hywKa2yfvJ5XSmpY7QiMb7zKjosGJti5deymx0+o9NHhHlTINnMVW -LMlQ9OyIig/2OUCWWMwrm01axwOBAmhEaI1YoXJSfgnK9kzQ2gFz6n1BUHGAJn77yp2XPq6FVmjY -fC6IiwcOPMzsPVv7lI4cyvsv6EmLnHF7OBLDFWoPwjdPv1fcH+fBPHXSfmI8B28nkiVIkqr0GfCc -Yi65Dn/P8uf3DwdgGfkQD5XhaIh5sPY5iJ4A36CSL3HyOr8RZwSR9D4TUNZBcsSdF5Gwuej7Ku+d -bLJUaDyODLoK3ZjP54qnOU6jZaxEA1J1JuDWwFXcDcXXEN2okIg4Tz2X+4neG1UfsTXmPe1twrdU -qj8ZU0B00nUkxKzWVzueS58/7gGfZ7ArswAsIIERkKt8q9r/ApyW4Znc7W4SLxT/Qeg5414yHHDA -jj7wC5nnkSdN+93FpNoz1DrKaeo0/Y7QTO+K1EeyeCZGGZaPh/mreaFWiCwLFO2/FeTF+xoEQvT5 -LZ9MnwfkF23Jec2+x+NtL0fVa3tpQPCgL91NDeIINYynGWDfNmqk1jB2kTO1ARnmabRfHLzspnzZ -aqejAh48L4wufAe+bPNDWYopOAlvhRGT2VVeADRykIQpcbvXl4UxV6CLw93nYyBgC9cl6mCQL/dG -30doRpJffLJSefsoH1fy12dA3levsR9EMbH8kSirH+oF4CV1k6GLm5c8hBxWRQf1fJOnpaZfYQNo -DpdxDZ6zIWtFm5WcHFdmH06WMdkT0cWHaORoAF0tno+1IJu18R254kKFYXHwXAQrPnbxroe7aCrL -2Jd9fPVKc0Mx2e8JEAWfu7nv0x4nzeXxMp/ozj+DdO3OD5mhDd35x9JHcDeKSZqp8wJ19lw9kRVW -OVVnu0EsTrOxSwrgavtqmZcIow4QM7WX43y7eNUqBW/6gVzqcjRUVJjCfTgIe1S7eYCu83PZP7tY -5pOhsVcBJYYNoYvvvpq2UTDlKfAOFFf3FgDvMYo+F5sWZoBLWuH30vn5LF18HxUiwMaIXZXOer5r -8KxNi/aBiN9f/BxUAsBsc+8lWun5U7kboj6hydENPQ1Tl5/pYbnbPvpWmzcxHFlrHx20Kp39o5tK -p5lfwCB317j7n4cjMIfJPRgxrQF45WhhHL/2QQmtWD1YP8VO3Dk+kFzmr72lj0Igxc01WFN0Yvey -4nlsLoBRRfflFw1f5vyyX+pPkn4FNRih2w05rZI/ugfL+SSienc8CA24t3cJBke8BXNY3QXLs/+W -+y7QaSCZwvvlwG4wph2c3A6yAGiaTX3kz89NW8EmZ7HvUJrRNRm3DiudEViUzef6S7l3ehQtnZ/t -tpLNw69KTqg3vqTIrShs9LxUHO4dxMT1mCqDThTmfi2DiFscoUHu7uO2AKd5TpqNIig4N9XXuCeU -j9Zez9Tmqzj7iWGBLb9VmNv8dfr+kDCQxYlMukt1oTkFizwWrB5WXzr5afWWrZxUabcCSrTTnkXe -C/ZzycFLfgyWc+kif9POfZNmudi3ELBrG958/CVdzKXuv4fx+3CYy7fzMx3jMdHRdyHqiUEbOj+t -eb8rJ5WeQLBMNhMLi3Bhe8n0RH++qFjl9MyYS2L7e6AT3GcuNjuA0cHC9eEsFpj627KZlQnn23en -o9xJdn6Zvw2dn5S7x1HTJndAL3gEqBzzsmSC1KztV4r510/wI9CB8bRS84LRwxD8uVmgXQOLJz3Q -Lg/TscobCiSU59ILRHNSjl4CcmcHysQDCX3eLg6ii2Yp9D73Fr4WkyEJ/D4TAQrjRij7vLEP0nIH -PwLzTuEtd3ewWCgdgyyQOX9fJpv1p1dizFAkhw97k5hCbjkU30DiN99aPA9LH0e1cSLKp+/Rdk6a -e2sODJgGchrUaGdA/HiPKsVC0gttuEtg8OX5Mvv+7CZntZdblj73Xx6Bb+LulXsxz0meytYnmiWQ -5m6ZXql+cfsABGstAFj7uQqJplpJKRS+xaZX7+HyA/S8ugBW58N7qZ4JM+W3q+5r6aM9DSpw4U7K -KXJAgV5I1cX9M+BIKNJS8m8AtPdk/mrWmycvo506mJbpDTBCy+18PHnzqV6UX9g6Ar8NZLsLAtgf -5cMLbyl/M70olbsfnYwhGtAq4k5eAd1CXZd797mEdrFRgv8p9nTjZYF5c/xgpDBie5WLIzgJxVJ9 -94MyQxN9Wl6Zw8jeRsr56OlHo+I+ryYJ18piyYrcL6OxWgBy3P6JKw4zpwm0YUJuegV2R3JjLzAr -hEDp7AxaRaHCuMSdvO1BYdO8froExlLhglSDyfwEWAz3B6KnIW5qPuVb3fkH3lNiMtyt6gsirHHK -VNL+PTn8AaODskmJaRO/GzfaMPZ+UO7M+x+IQKSGQKx9/bIPX4xJrLG9z8JkL/FF+Eu52vxbXp6S -LyGiuQ+fsPH09VUTmA23jF7yR/nS2WQoVIpcYQK6OI5V3i8Ok+aq/ip1AoOQxYt+Y794WbyjTQ2I -RHIW6pW7s1rApl376P4VrOqzvcLEd2S8biTszdPLBzC1w7h5B5v9Ug9tLxtoyjAwr4Ke1IUv/Jxv -tw+vlSiHpIGKl+XrT9GXyJaPkbmtUiEtLzQkj/MJ/1kxl369HSPriAp73R4xS2Hx8A== - - - UimXovFCzNdQUEeQ1bmCqAVytr0AavV5Xj2stOeF8WSWUBtEH0YGkTKa5pEvk786fi0HYvEZFnr5 -m10e0SbNJXt34nZ0rH7rS7We9iVCXu9Bw78KpUsPbeQDEdsB6vqlXsb7R3B7iJiba6CGLirHoJfe -a2B6HfsLgXQ6pSZ8GuA/AXAfb3MwzeBZQ7nY8vrmAZjIt35ppWWHKpPjpDqecoXIqN9PV9ijstPP -ZQmdBZ7e3A+WQPsOCGfqU6N0FDtNdh76/V4by6/wIvx04n98vyuMA3S7+tiZv6vFmSTJZCEmK1gs -t8SYDVJrsW86WYWblVThazQ9gGjOS/WHVk4VUmw+xdvvZfeJf/kyjGW/vely79qTUcU1UZNaqFJa -5uHe5hcifaBUaGTv5NCQigWA8qW8e0icJW6WxQvw2+kBsMSmou2iBokWZem8/vqNxKQiHkWgw7ci -Cj9whVR18d3v6hrw/WsV+c4LcMlkSp/hYk3xrhGZwTBL/bLv8voI+KP5vhzXjUFiPSD/pp2/L31G -Y3vJUe6rkYvvTe6lRXy0a0N9eYKkxI/rvXLvkXtOs/ezr1Ko/HVYKSduaqSELsNAQC9/dV5jkZ+J -RCeUpIlSf5m7y8/yHzFt4+Z+7E7ivtxhon0wjSnAlcZwT/pzWu5Dt/6r0snmn2G0qWoU/QbQ/J9A -2Ale0Im5GP0lWUBZeMBGvbt9vTthPz44nb4hAMUT17OWRp+rAAWecienhWXFw59VjQAk4qeZGlBE -R0HAIIFHuDxVofgY3GE/LveWe8MUl9mfyCRIkR43VmuFBOk81T8+RanpZ9IK6vTHuApdXOCPFR8B -k72mxMfLJtCAt8VnIFi+C0SgnFku9oEaLh+U30b0AIi4ynGpMu08lF4/Xym5d8cIykkx+TgBzrbb -LY8mG7t3l0IP7RCGhsQ6mNWvElcJu9VjfYSi6EJJmKocVRtzX35/d8CUzsIXTOngOUVxu81MdLfo -pYGpXhMqXo8fKgIggx58uRN/f1peHJ1loIX3GhEis4dKafF0kL+ZAc9z5H59Pwj/v6ySnsjAGjHX -1Rwm/gmuEjqMFBdYxZNhMnWPbNZSTg4Sr4BtlipihRM8QGKG22nroUgQRB2UXY2S+/lsPF6iIzJm -vGuDkm6jrH7YMdD5Dj6SCp7gM100cQ01/LI5Gw97VhURMPERfi+dXkZ0FR5hBjpWZOf4ILOhXGhm -lDUuASqio1iGqqPPjI+hkb6o8uwPeCwvPt1Tn/1peDCN9HFr2QWTVplNFzfw7AVn1ZwS0cT7Wn5c -Wmc/S81vBQ6VJbbJQlvjc3Ok7l3MprPegJ9NOIsRGtZpr3AsFRON2ZAX9JhrqU5W0ycCS+0LsHy5 -oCmetpju8YwvKMfERCynGpJDIcQZPAoi3539acPgBlxyPpxalVhLH1UA1e657t2Q+8vBGipxAmB4 -dISH43VThbPDLrj2YDnpTtnhWFiNBfG6hRdtoeNYzvpg/Q4/hnLBhWHRk4QcXztdAeyV5xd/zfhR -QzlWw4ol0KQVlfOQHFKzzQ8nF/CcB0d8h5BoGG/1kxXkmZQPT8Ni2l4sOjwHzoohRDrBKhJByxSr -TcyN+nABm9XXsD6fydEBcaaDai3YaZ/l+6RsNuqPsxMLreRlm2fnc8ujELTaJ9/jZ1120WB/cLzg -gJGhUDDmY6P6Lb1QNv7Winqibj2b9oCe1PKE/cze2BwyoRAEHQQDV1ubLII0Pi9Lu0DvyTMI3O0B -IK6L5QGHDDiXeNKMC/An1O6C668BN3UJ7J9w6bFTF2mrwJG6WAE+Vswk6WjNoAvoQwgS/FQD+zFb -uuZAQcELMDhsRCDUGNwnvGByqELkdwFk8qdTQCfXYgZB9DjXEJWTs64x+wMe4wk4ChAcM6Ow7A1g -985gjH74OVXAYGxTQCd45v/sQ0E/FFzL6QheeRd0JqAB6B4/nJOHdK4i2XUWmWNWacsnjTCMiYFg -oBhX0qlaPSAeS+ngS7kKxokSxpKqTZz16gADFoRD+QgJayKgkVhQYTVp3bY85EX6DFiPpDa0M15M -6bxa31SWmQPVZ3wmqLVFrqGmU6GPJReg/JlyxN96ZtBqHxN2m71ZIDspcC7yvI3GNDXi7dWFESWJ -r0wOvXR+vDDwfwEGbA0VZXdRM0Otu2qpXdJWqoGnsDjtatpkyTNoiJegs8qBMDTxCh6/e87xU42a -BW/Q3S6EsmKUV9A9I96ElTeg+70hcSQn8VF5Cubd4Hxn8OpBPuCP7Frz88OgLVJc6KDaOdvT8obY -N3iYLemPqd9iF3OhP1sJdnLSBUodTZQ8LfoIAHFJqebiF8gn+EYYOCHSy50/EAORj4xLB33ZaGkU -Ob16z1L9o1YO/ZlN1g6+lBfhQiKciD3FJk+ofAbtMRKf1TpckeezX9+50MJbAj8KjcL75f5l6alc -Y9BvMPvgqTJ6qo7v+u/5WiT1lj6l7xKl/f6yXCrWXl5pbz41i+4WPdcRIXwAc3q6ISrku2AiJ9ep -dPi0vSiUPpLVUW3/JsOWPqjHrPyW8WVuYoPd43n7G6DZ9Q++aru+XhD81uk/7/qZSmvXXRP88M/H -YLiR3PVlM/NDEc1gERbH8F4/BUN6T6DimhLHF5Zl30XjHmUfSG9Lo2BIiMKQZvK9Xc2U7wvcTS4k -fJ6EavmnczDCuxYYPTUDTesT8FGziDDAcc3Rb1Qo8xjBnS7MhEv8mzjWhsDzkdKQCj2M4ugFnBul -FRwk/8I+R8AYEktftrp7FBEY4ULqVqLKLB/fu+DP6hhM5GOJhJsWHvhXT+mCCkVabnLUYOYAGvCx -7ymyx6S84Et6Cvt7RWB9vY2VTLFGr8Mj3gzrO//6vbhFWPEWGokYfFzsxm7YAGOIVUjc02ZYa5Hk -YX5khBWg4fmTvSPh+GA2Nxouv3wPHri7BzcvRlh9J0zDbKyx/f27p8sowgrQ6IYbeXyiKoXYlRFW -Ya/ylTiYhtNNI6xU5aNXM8IK0CDER0zksWxM5Mhjn6pW+UdDrInK9y1TbHdhZyMz3bweT1IIK5IC -zeNjzdSG+bvQAGEFy7NbVk/tM/9aumtCrB79vEZeI4vgbUCDFSU5IMTzWl0crh5r7JJK75th7fFv -CfrBGOtl2bv/HVte4LnRDVfYnxcqZlhrp8yUfjLGGvE8+tLj20sNVohGZKiMx5u797JGWKlKspw1 -wRrbP2jd8WkTrI+vVOW1hgpTjIa7VxHSh6PQXcsQa9W/vDTFesx95q40WBEahPhkN8QL8+YBxOrV -Efm64j2N53YvANb4XIu1ES88ilgfA24N1lirMbrD+gYgLr+MKqrhPuWoxnM5aoh1r/YtxEf71zFD -rBdefqjBKqk1hDg36hTzJlifPVQrxQnGWM8DL+d9zr8wxNrqnEKVbDrcy5davWCGtUjdHT8kjLE2 -9petz24/oWAFaAjEdw16Zor1thqqjs2wnlN383DOBOspvInu7u3+PW843PvTrtcUa6eTX9ybYH2J -UK9XbY+CdQedViAjvrz6/HoonXgNsb4ugtemWCdN39GDGVZUm9S5/j4xHu5VzsM/54WiIdbyVyBm -gjVR272/pBoYK7u3qCK1piA+2T3ll/fPEYjVp1s8V/tpz9ty0gFYM7wW67v35kDEOkp6VVijMGXj -iLoQlQ9znHXX1FiDvPBZ34dYA3pB0QjuvuzHKgBrTtBp2ZdZEmM9dZfRSRJqIu/mK1fHGOvrIlVX -y8VbX7qWqUOsIb2WvaUD8cbRF8BaWWqwIiU9PPWIiFPXQfVwa7eFw6MThDV8ettoqMa6/yxEu89I -81B6HZA82ntYXJ8BrIxHb3LwfL47vfUdhk9QA93bQuL48bbxUjd8u2R3T6izF99C81ZRBOxxlmaF -5r7R52AeKv7dw8JBCb41EHHdaSxeOaDhWx3n7NUG8OrK2PQ4FjZpMOXjV6+1qMnbxSJBZ5/ixm/P -jnZzV/fla/TWwE7bO1ukz8/q+4Lx5+fUa8Pniy5N3sY6l7ns8ljzViIaaHD+0UzF7wKGnycun2iP -+/T5Fb7166UWdSDPpp7xG7EjgOaWfS5nTRqcuO+KJ/c5k7cF7/0BPyyYvK35O8VY+wW9NSLaRb7y -lfGEPcafX94MvoRO2Wfy9uFrEhZCjOatQrTLyfcsMOISxp8/vjYlu9rg7av3WWZy/dvON1TSknA0 -aMA+MJk9f7xi/JZ7uKws9q4447cf1Ovg+Otsz4xoh/fX/Tv37uWp0ec8n+lch3PXbjd8G9S/ZQpn -V9eFCXwbMliefL4zEXZfj0tKg+zcczInfDQocRTfF3twxYD3BoinRlx2SjXuqSzTdr3naXrXX7q5 -3/XfvbWgx9nedT97lvC3JvA7R8XdwHknqrh4wBWdjYzc7tBFYnoMvMWHJZTubiAoP04IO+1iPzTM -dD3AfNsrC4lmSC0I+T3mONMMYKsX+kGE+M3uh4+Re4rUCvSDRorsVbAiCR3xvCiItVj3Km8BU6zI -DzLBCqxe4Ad1VHYaOdzI45sF1upu1Bwr9INkrGEFK3ajEjXoHrxIw62O1UR+JbFGWgckha9zNwTW -/tHRvoIV+QaknRbWEBn6BnNjrJHHR3Ose5VPygir5EYh98BouIjI0DfommFlLbBWqZTaTlMPFxka -plihoXFrRmG/EVaARhru2ZFmamk/MCIQfvSbOBmXy76jdlf7nFYKmDTdu8rsOgDJLzujQ0JuwFGr -okfIYSfkR//I7yZCOOC3IjTuzhBtdCG36tUNIPOFX/xxSp0pPr0YGov4b9QeQbZ5BOTd8XNR7Ad7 -U0ChtOzc3W9rxRTAXwgNuNIh/LEvY/CSGCRRALrzXEJzU/iqwFZhVbAKyMBstnxI/ABiUrGmNVG8 -a9jPb6mJOGClx3Bu6tFD/AMyhcqXEPt2JY+h5Mt2wzWChjL1Qadvm+DPIzjXS6+mT8i41XVLMO2W -2J39lB/9wCTF8RlN7BBTvbFETQiPwJDw6McN6X4bjPCUPm9YjxAxNBop+1Cynsbw6V37wm4O/Rci -02CfRxqh4q3hQaa91vRyPofV1lThUlGt2dHLAtqdE54HaBywPfVx/P2wOn8pzCWOBvHXjGYPjmtr -Ul9N+pCG9Kq5WZX6XcGpjBAjUF4jQSRKoUf/VCuFyi/FOYlBHr+ZFJLMQf2MvJXp8qtQlWGEjWlY -PT8SjTUD8pVfrhaa5anrERL1fvjjmYy16shXhr7yuYkQN1ueHtPBhQ/S5401B4fQ4PG97NuT+wiv -JbOeUBzbuTUaF1JrCu+/e47QuIxF/aN/rtYajoekFjbll1JQxfHyelSxO8U1g0dqQ56cqmz15VtD -GFl7rkSbj5T7yUxxX8ucoyhunxVDUx/F4PNK0ExXH7Khu8xMuwDZvYZ24GuZAWyFlAImE+ov+/EP -cb7wFoeeN7rhPespVdkCokhEEWyDNc3uXdCm0EKDmS+j71jq29QW6DLfTOEpWTcepg== - - - v+A2sM7MpwUYeok52opQTQv4/Ja3lLxOpVAVEqYi7UbpNZW9NUlMcr+qFrF6NeUv481iB5M8Siw3 -MapUUgB0v7trTS84wpBtn5J7VtpT6ZEDWw8gHOyb9SmnLF40h9KOh/k02th6neWxgznEErpftbP1 -nC7UUYKXVRcBSrFsVobWP2bLTjuGt/AsoNm5Jc46huYGQrPnfafDNLL21ieaPOdbIZpauq04TDEM -psRsmMLDY0Dt3dbgkilvYjmL3Vlk0Z60U0/DWKZ91hyY3limQevb2ICoaR32TZbnZ415XRbOV3Cn -I0ZJMZBAp4bUkcxBpwRy7hmqqEMaUHDOmxOnvoTZdAtG4kGzbkw6o+qJIy9Q0xPSYcedsZMHTnqi -tjpBT4ytThuy2AkAjfPYDXsUy0atswoPnchqrjvc3tTkL0lLICWI5uANGRR3lxarYTAJf5xBL7hq -btkYSRKThQIcNa3eN+oTQOOoWxuKAkl0gvZfZ1sSBWCERyvHBUxHeJq6vnAqv8k8G4NulRZGBoQF -85qY+TBm8yoM6G2xVvVxbiQjxGw7I8/IzHX/OqM+6L3HFfRdZLYDK+JN6LXiYjehFyRWdBXtqaeX -erFnFrqVTteXBAtYOOf2sai6sthtgilWQQdgQx9YO5YOjHtJe4YPUjCiYOc6Owjk1rXGPewdIQWc -RVQADPfqgRCR01SU1mjqNYJEkzrFCaN7pRMEC6w0pPpypaCeiVoLHyS/I6vTRk+YDm8XHdQIBZ85 -gSxiOyRDE3JBjEpoLG30Ecx9ptRm9rnWzDakPwBPSAETSxvI+/1NyXeO3SjTbS3nVjJoPD9X60WC -LRCalVRj6nob6+ZcqxXXYPfU9a5aG4Y1VqezMHb49PYwvNKQyCDklYqDHh2E5y1FwfxcUX/EZvE6 -tFFrPhNRADQfdKNkS9eMQHEHBLI2cwmr0+P2qZNCwLgeWk4XoPXqQwwNRPLGuxswbh8wHbUUUnUa -3oLQQk6YTB2iNZHQEBq1qYgpApLmtNura7AsmjlHOhB6BHaA1M7mWt3BLLDxUkTd0e1zKFDE0TgE -1OFX2TcgFKEqfVSCpt5oXEmtagLq1dYUWaIa0Qke28kPpyE3CEpWP3I6z7pBGthfi10js51CM8vi -oe2QmqRhKks3Ua2pTXuP10C63W4i3bRzczfbgnQTRlp5pHdxnUs3YWS+a6SRboq+MXG2IDRmY+mG -c6Bae5tKgVtr6eZcCtxuIt0I/wYB2ly63W5pFxcB6phuv+UobnEbEhlJsg/g3KhMBGLeYFIGZepn -q3YgyRCdwkgiRyixzmPgJme9mpyx1XMpzMaP629s/W27HX4wpdYSV94pdCR0ATQzm99a4hrt4gJo -myRU4HX7cUx6ldIW3uoLG+Yw+JyKByRsLACZW3irdCeoDQ2tC8jGRJQ38m0Bma8ge3tdtRWBoK0Y -J7QIcnv8inIkZdr9dqx/JNM0ynEtpxB6YTYaTaMcsdVpoh8BNEcupn2CBmQBAG3j+EwRzBJ3sAW1 -dr9JBEzLAptb//dGynEdtXZvbf0bQVHi0FpAK+pHc+XI7qFNr+3oR6QcYRa6X6McUUKNbKdtqB8f -rJTjFdQ3muwOaxKAvr0tzTqmoqZitppv4UFfwsbWdGwEA1ARh4rAfp1DaFHb8IO1HFcRbbrSbPos -GPrB4Yq32oYFK0KJeRsGuuwz9rR9Ml+tmC3QhqTFOtNoqqCBG/foQE1p49CmmqorWLhxtqlxurjA -ozaF34yaThZZ4WG0t63UXgjt21zVIH4h9Y319g+EtliDl82I5iQObbaroJ5NJdPXOnIrQjOxO4rB -kEWmL8kWIULYWHVLs5+6clqsKsoBf8OJ6AYIybNj3DcHcXhwTAvW6DV2A4lAx7qWD6DZTjmfdS3f -jli0tHE5n3UtH0CznXI+PVaylm9HX7q4XjmfdS3fDjoBZgvlfHqsZC2f5BRuXM5nXcu3I54As3E5 -nxFWpZZPjnVuWs5nXcuHN4u3UM5nXcsnbXpZN3VQzmddy2ez7+m8nE9cVSa1fBrj1iYB2rwAb27t -GRtl3psXI+W06W1O+6RxcZtHvF2ueKbrdlC0pUmeMfKknQakmkc2+esrBIgBqZqr5K9b7BQ2j21S -2ZySSlvmo65eFffrvQ6L0nxOSaWAMvFvIDT/lkYIK/g0YTtdsp7TEQZt143zbql3g1bp0462ENMm -bGbRJ6vivR2loMwm5uxM7Dz6eSPPUJ+obFfGtVZ+iaFT+FZeM9ysH1xgz1kanM3gHOaXYKJZlN1p -UkxWDyWiMPMWAsRlB9s+ohtlW3Zn7hE42q3AOx5+qw0LlaNi56VAUAZVYkquuj00dYIXcGyrPrVl -UTF13VeW0Ozeg2kEytwzNs4aqjioe3VW9MpWkChUS+j1YwAVy41xuH9jGmszizX69BGVftW6hmml -Ta9RwvzgAetiNI1xi+vRnhfbqimU4jKmmfeOU/n6VdvyJZTRpcS4LLq1OK2bKE5HdY5E8B50yzzz -Xp4+R3OYPNDM4fppCbqop9UcSuvGgl52NTlOOEJMia9qzmrYjL/0JTq6HY9VoBkn869LNF3RzkZE -M99JWXmYutMaViSaOl4c57UZ/bDWyLagzJmZ+1mzLae8mGnK0rSxTvvSPT0MDQAj2bOjKcRs0/iH -zTpfnGrXubWTsyMfp2tYh7Vw6s4bmmhM4XHvyO6gGVsYDx0br0aZa7OKFbOqvZVmyWBjxdwpMi+2 -s5MCCjlMfE9IEcYpRUzJofCcvDxNKWJlz9Tsz2fZt4yqqy1M5lXoBtUW5pldpa7KvLRk6FdhukqA -w6JQz2qz2EAAmZdlWdsdq9hpoFtOCqmMNkkN7LTXhftoK6Q61iYnrU0q01iQhg9sA10OavQc9An7 -N7CwzvoIJo33Y9Gn8IpqzarYb6XojXlKPKrQW5tU6ujNKV1HtbjquHH4IDm3cfucRG9O6fM9Laet -V1+1QvRmB1cWm3kVk/p2ojdoedLnx5uGOurW0Rslu9u2Hm6T6M2OXLqY/N44H7luGr3Z0RbJ2tUK -rhe9UQfvIW2cFgjZVAcB6sScMbSzxIvcUlcam7redZCr7sSQnp9vpULy9Ja2TkFw6oeco/CPecxm -pQjQ/Nw6S3fnDyfxSjC4jGeTNDysb+bnpiefrVTGZpoMoYzGUYnfuhmTpFN4vnpOoNEsGRWwEMGU -FdJOUJ2f+fla+mWM0FilAwLU+8eaPVnwzG2d76XVfKb+zXYr86z2CLZYmWe0i2tau7J+ZZ4q7Vop -ztsgGdawMm+dZNg1KvOMcwdb267Ms8hP22Zl3g5xyKlpEuLmlXk7qjppuThPtYK2UJmnxGxUxXmb -bdzpK/N2TI8x2Gpl3s4fhsV5Bimda1Xm6b01k30hGHfZvJ5kB9WtVawH7jj1UjlC2c7qdJJ6qUu8 -WFMK3G5e/Q/lkdOESweAVMdvrLlZDAFpXOz1uiPWeGy0RSt2x+p8VVXmvb10u7UMoJnXMZD7npr1 -aLAh+HDndD1qFqM+NAQnY+PDbovKKceK6NxgPZZf7hysII1MM12P5ZfHjQpcsakOaL6F9fg4385R -xwiQs/Vo6eIiQFtYjxCKajGaqzV7QLaV69qjwEwTuyE09Zk4dgdlGUezJccDDtKnCXnBZzYazZnb -/XC/s50i2ZfvbRbJAmhbLJJ9+d5CkSy9F91CdBAVivmdyr4dqyJZAGgLQhRAITdWNgJk41/tOCuS -dX7QtXEETB2BggvF4ijYVfOXoKDwo8WoQZNy20yGw/WoLcrTyrRV64UcFuXtiCVY1iHFjYvydERz -FPxZuShvnVjnGkV5jnzPzYvy0GhUdXnWKWRrFuWR4QcHxa/rFuVp4mnOMvugRl3t9HsbJd0V1DkX -q55+r7HTHrd2JBwsfNPnHRoFIZ0EniE0/ZmM61o2XUF9hPK6OxPIjSoGQ472gCySIWDFoUVQD5nq -tupCzWQhh2xB6Ap1SBWrC3Hb8hpfpWfI1apL1uMfzx9x6Ur1QqPMv2U6mXZpRBcLofp9aZ+rw8Oz -Sqe+Vjsze/fFwG/VJmh6XKw8vFT6zHF2r4T1E4oSE3Fo8TdV2d3lKVkRpq5DA2iE/bvHJhntUpWi -ZVPF50ezsrsH07I7fvmeojVbeJqyO8p7YYI1tn8Qv/G8mpXd2RX7zcOmw6Wq+0+3pliPz7rBT7OK -MI+m2E9TdteMMgRWdSmacBw/Uq7E1ZbdwStAx6bFfhGPRbHfXoUNmmKlKucnTROssf3DyGXp3aLY -r2NVdncQM8davd5/MsK6I95TeHg1vGDNiv1uLAobL8/vzLGWy7cVdfAeID7AZypIv4l1gUtvJqRm -AZN24SJl2g7ZAjL2d28q7wCkLzVblBVlCkb9GNGaqPIGkBRPU+vYolWqv21+ryY535uPetAWE2kL -lFbKnrIqLspoE9eMdzyc3YGmdlntM7rMu1W0yVx1WHEoOMjoWvV6PaM+7RAV+du4Xs9x2E53atva -pJopmt9h7qDDm/UM+mQUtlv/Zj2bESr7N/AuPKeZwXZ9sr9dwTHhHRQpqE+DW/9SPcd9gqLT5noA -o9TaVW/lMwkQb1LYt2LMZt3CPr1d/1bWEW3zwj4TG3rbhX1GUURl3WytsG87hZhr7YlrE/y3UNhn -VNWniapvo7DPCJSztOuVCvtWVtLrFfYZTGkFEW27hX3mGytbLewzquqzyxpao7DPyGI0zRpav7BP -myUMq/p27M5+WL2wz8jkwb7nVgv7jKr6drRH629e2Ef0SXtw8zYL+4zMVk2AeBuFfUZzSFo2Wyrs -M6rq2zG8gXmjwj4jUOJG/jYL+5wQbQuFfUZVfZsTzc5itCPauoV9JpVe2y7sM6rqU1udK8OwlT1i -VR+hpLdV2Ge02SIZUFss7LNwcbdZ2Ge6sbLdwj4LfbPNwj6TqPq2C/uMyLHzx9YL+4zMS41xC7u1 -sY946i7xGh8RuVHCp82BAg4L1XZNSS+5UU6rrxwXBKsjPzqTY/Nb/JQ+WZscG97iZ8Sl5PaqOals -7wA2JpVCJzHh8syBteGMD0oLowt7FRfXWbekPjkWCrhPZqY66tZ6XKXvU0d7BvH6pLK+ptdA2Fh0 -i3O6jG80/hIpbAw2sid1tYYwSOx2EsqrbyXVyv7yv50/HEeaN7n8TydsDO//W3lw2kvMdnQFZc5q -+lY8+twwH1p3/99aQyIv/9uxvGbHslRqlcv/LIKQdd8Gdx5pqCNu5Nvc/7fx5X/qdB6Hacda8p3e -+vatR73j4Iyu+fn2ajxOU9eOCnLt05/A4FLuzauJ5ueO8jtUXKrfJoI1fY7uHLK8ZlHjYhsH753V -9K2QaWyqPWG9o3lmiPNix5izI/TsjetzB0U4ihvl5L6x5kRf0tScONB8O6r7pE2UH6ybC250iYSY -atXaXqpVa6upVq2V1J9pSBXQfPVVqCt4YjseCc3GgCxOPZeg4BRFW0CbFpjC0SBAmw== - - - LkUExVSS76gLmO0TxxC0Vap99TdfaKt9DU5gBs8y1op7heMNIbTiYk3TTw+KcXrTEqHMTKn5xXlN -qamZG8LZtMraBlacR1tCAZ6Z31Zl7LCbZm3frmnXawtj7mYbmxcEqC1e7ng3c1BC4UAKCKPVbvQ1 -YrcdVIiZ9m4MSH8G83pb3wjQugWmpJ1W1J/AvO641JXzmsMaV0uLhQvFaQmFs81iaJN5dSVNx982 -hTGOg/ewVnEb9/6REahN16PFvX/mMs10Pa5z75/eVNdc/bcuu6nv/bMqvrAH5HgZWbi4+Oq/rYxr -O7VR9vf+kfrG7qqxDe792zG8F5e4+k9eQbb3/jk+vh3mvji6YduuLEyXAqJPg3Nc7cvudRzU52Lj -R2Jo82pfdq9rE1uwP/ECFWJuodr35dv6eJ8dZ2d0YUDrB7+UcDcEtIVqXwhFn0Rl6K3ZAzI/2864 -kIq0obXztmb1vdGmNp4bT8BgPT5ssh7VhXKUlUwzqqWyqgnq8KbOGA7eO6+lEoe5qndvMTcPW0v1 -ekAXbKxSS2VNNFMXf2XfE1aerl5IpQvew6LHO3MxvWIhFeiTLvthxVsItBZjMRjQWYzFYMjBcVOO -PLhH68swycwUh/f0DUyPkzC/DNPUTisGbfwmx6dqAVBRZ0FIR3W3xWDMumMrWDa6pJAVdia0Obeo -+HTjyzDh3YEqHUgQbY2620fLY+q05dhW6kJZyVSo0gkYIZTK3bgiz5/Sh7hasH0afyw9VR7bpacy -D7VnvhZr14uFYK9YLITOYb5oay5pxcOxuoNiLEpzNd3tfPxsXJl3svuMyrfIKIeqEPE61SQZSlWZ -50v3rszqAaMD7+HJ7kyDFQkbsW7MvBBR2Kv0Q6ZYqUq7cG2CNbaPStVUnKauVnu3wFoNJAms2qvp -Uj5Bxopr5LBlIxI58jBopE0KEffcpjVy/PKdNq8H9J2kJ6qDzbQlgaa3DsKxPltVIU60tY87qvK4 -yqzdNsV61OAGfTOsnFU94PWDWnRqSwIvn6smWBM11b2OWqzXmnmVdtjFLqDfRI5P6VjAuF3aQbsd -VO/50nAEMuJp4nai4mzEDMxRaQVXlmP9LViW8eWcUSa7VXamT3tCHmLo5tHMaX6albp+Lhml2NgE -U8xLkL5X75NhvgDo1kopNubFVZIRrHjS6yZuPZfsEufIA2ht4k7NY/McNwfTR3hrz6XVErcs6tB0 -WVv6uIDjukSbTFAVS2FbwAKaKY+uNEIcVV8pDcyqT2YMqqwbx4S3u/LFqE87Bgc0wbpEyzSwFfok -5oCRJgfhjeMe6fNw1aIrONPthD/650Zm7g5ZUOZMdL2VV98G1XsEmsPvNqiIKis+8o71YY0O3OS3 -8ja2icDgXjaNp6EKyc0PuoYTb73/rawbu5LEjSLSYpZqeRsHXcN6RMd1a7ZeDYRmngPmKJ6mSUXp -MjNtKS+717AetWNh02WW2/GklRiyImzW3kOvWGblYc/QKK/TJAIDD1EzP6jLOsYnE00dgcHnV6gy -Eqr2J0OYGylah71ftVCXqxW0JRba3ai1j2LQnZ+2YaWXXTa+Koar75Ncf3Oc4UyPYnBgqpN90oRI -YZ8IO23FukS1+LepLcUGlHld4paO08C+511gO9AgKMOqI40t4ByadqveumNYe5pDs70peSWi2V5y -5HyYhoVJaxPN8KajtYkWMYWmq2I2NxvjvBjuXrck0Wk9omn9jbOSRKc1VIYurvOSRKf1iKqQ6ppx -aAf1iJih1y5JdFqPqN1bW6cAz0E9ohwgNptp65JEp/WIO47LfEwp4qQeUcqzMaXISiX4pvWIWAqs -XZKo7ZNZWGWHKFrSzbTGqNrgssIdB5fUbeGywh18YMbeKkJsjcsKifDDz7ysUJVzS5Jqu5cVWsm0 -LV5WKHGaLR9sdlkhYQ7+zMsKd3SVXj/lssId6/s9N7isUNUnyAIfjciLSbeubh1VLNN1wfq2Q+PC -mDUuPLQOSVhk26124aGV+4AKyrZ0qpXlbYfOU3ttLjx0mAO16YWHcgGgoU+vsqGdFUdu41SrtS88 -VM2S7rZDTUr8+hcemjI0WnNyUt+mFx5aW/PmyUkrXnhoUlBGH9pFoFa78NB6NpXcwQ0vPLQenMTQ -G194mLW87XBnhctPLC88tB6SSq1tcuEhMVU2x7dvdOGhbgWrMtp2LCokVy+BMq1/wpy2hQsPTRJ7 -xNsOTfPTVr3w0DqavOPo8CwHFx5a+8NqA2qDCw9VBNfddrgGpxlfeGgNxTD8sM6FhyZQRB1oF7x3 -fOGhNZQd6QBaC0BbKMvfkYtkN7zwkNyP0d92iD3pLVx4KK1H49sOlSTyDS88tN7RFKXA5hceEvs8 -BmYFkcux2YWH1ineaN9zGxceWt92KDL05hceWu+VkQbURhceGswrcduhzda38wsPraHs2N5TuPF5 -I/I9hdu48NDawndcSqK/8NC+5MIitXfdCw9NzHzxtsMd7dH66154qMuRVt12KDkea6zHVXI+JDTm -69HhhYfWe9diWsLmFx5mLW87XMVUt7zwcLVy7LUvPNRCUS9GbRL52hceWkMxM9WNLjxc6YpCNagd -/SFA61146MOFHia3HWo3VtYt9Li3Lg12LNPsLjy0Nn60nLb2hYdGHVN87521j5vSXHi4dnRwtQsP -rW87tGUBh4Cc3iq/6YWHjjK6DC48VO0/r1Z4pb/tUMNp6194SKLR33ZoF7x3fOGhafaYSq1tfOGh -dRKVHFLd9MJDNdG0kR890ZwXXqkuPFwn1rnGhYeOfM/NLzz0Wd52uEaKovGFh9YWI8zo2sqFh9YW -o8mG5OoXHlop6a6ARrONCw+zlrcdKnbahhcemvrqKOpsHlVf8cJDW6Jt58JD69sONRUr6194aK0r -9Enka154aKErGpEgMm416qIRseg0VhMmJ7MqEeHwQXIUUsLBkvbUbIdqFrZ1vr+6iFIbAUMhL1J7 -HqkEgHtChsiQmJbvQkH1CVIdVoKMkqu9VViWtut+9sBKr91A6PgiGG4kD6RWDYHnGSG/6/3kr0OB -w9RR+P4imo/GfMLgLDRbssc1LpH0nj4fPO3tni08u/nKTWjv8S2WOmjd75cOR9NW45gbzAOxVuO7 -Ex/1G58ATW70fjk451rJ5OVL7fuuRc/PP1qD6+H4thq6WN51qh53p1P0eb4eo19Xk6Yv/TH3PeUW -/GHLfczz4YPdvRk3Cx1SB4O056nRu/MlfRfu7PfBpEH1D6clnj9NQRt61/tavdhlCldjX7oXyVEV -6jRLVdr3Faq6P7ukqleXA54fngb45SB7LBz7L7tw6Lti5Wf2u+zLJC6f4bTsogI8qnwX7/DCZ32f -Cl1xPpMAsTg3qOQ1KyxKT5V8o5LJZ3rKBZn4hsXjwveNMb3GdKQ1uD345nPT2OXu/eU5zFU3H+7y -PXjgPTp8aB4k0uPCYbNVrR+/t84ykeTRRcwnl6uCqXopB+KNoy/AG76KsFc5C+zyw9cQrCi9AXrm -it/RXiNaJJfR++FYFZGFNoYYpS0og1O0EUmJ0/hx6mjGRMr3he87yAKhhbfkS0a6oUKZqeXA44t6 -7uO2fZmvxd4vfclo5rSSPLjpF1/r+zU0Vqbw6Ctj1kZXBGar9264PeP2lfyHy4q7dnZGl99SJ8Uh -G6LhBMEbY8q90XeSCj2MAkyn1vdTIfY7APX+AUyyCMDPgQrNzEbh09u9INrskUT9/jHylqhQNOJB -fwKi5Wbgz5QP/QlW9c03+DMXkLaJAEjOj34LH5ycvFc6nudz6uMt95lLN3Z50PNzsqt+avouv/CS -L4qHXfmFX3khZnf35XdB8qPPzIf8giJeBA7OBtKLSw8aK11t7LHyMx/RuPoW7MG5kd4FyHfzFAWf -hUQNEb2kYNHUhK7FGgz8k8HAu2+HMvBrH27SndPwOJHrgCx78FWVWTe8IOc6iFv1YkUI6JpCZ+TT -vdoV+lOE23t6ppEbQ4UeK77QRWsUBm/bfvSW8cRSMmHaQYyG8hwk4Nww49Zh2Z/0vOXS1N0ByZlA -fuI9BeSF6l1cUREAkCEFpBE8IqruGCRFgKRD+8KJ7zbNx7K3kct8/LXvxqvK89TaFXn48Rnqm/xk -1hDy5/f37wqTMZ5lfySN/p5gGaZUy0AT8R4zOVN6OqMx95d6V1Hxt/EtI/62fH6TEseYsoft6HQh -VHBEAW9mfkgIAHl5OhAAaPVDtZaMRk7AHyf1XEiYnyIpUFqyzStDAaC5YFjkw/oEexpATHvQQIAk -q6Ml61Nqo6J332A5+4NwWtzgzxcBNgj5yncPNUjNF/EqlyjtRtIFXRQK/ox78dpn91oRBBz6PN/i -jIC1j0q/oW3xhNPg7njMo1wzfoLl58dt6tkwegIkw4vIJfIP+IL2Hw9CcBl7yPWdXMAAMVIE5OOG -Dy6s8wBeI/63OCdLAQAjflcrvo/yfWi2jAvjvWlFKw8gC6Lpg0IhyJQCzz4qVM35RIa+UGYfWyxq -dwPQplmUbYwTcxsDZvwAwfaQZsrey2uYKB2j6k06Azmt9By7wAP35l/yaEKhDX1N2twoDNbhgQD8 -/DyleznqAop/b2jYPAN+prB4NNg4hCq5ESW38Bh1uuexZjToEmxfplXui1ZEpqeythAbn5xjzww1 -ZortbkTle6LH8MiCCwnG+6EWxrLb/AaGRmKJTa+jJ6ZOqFX0bDfzCMXIzQIaX7eq0vsG9AigOdIk -YURnFS2M8NmzAqOlLsuPYn7x5uNTuG6OGc+kEIc60w10wCcFFSb0b8TH7LdXfDza88Fs4ai8bvoq -eTAbSQZJilbsDm/u3ssikwNaKpBfmzPljmnVxgqFTpzF50KUhJZ8qsAbNMz2RMNsfHsJu7oHXzyq -jyVwS3ODL+u+lI6C+KQ0jgcur4W0iTw+KVaf+nZqqQoQDykX9pmd/IHL0sSby9U911wL7peZZ+B9 -5sNdo2vJQe9SgtQ7BECySeFZGcgcxSyAbjpP7itk0SVtGvQcYRUngw5qJkNzDj4czfqTcYztNAyA -+byWAbySAHpXF2h5msEov2S95OiNYFh2At0JKc+NVT9MYSjz6wCAODc6GIWHx8Am1MS+pwxgRzlo -Rn0ZO1gFJOEtmNFNEpdsR8ATRadbIQFVKcSujE9gAe00vXQ6X6SL68Z3MCBctVKrK+OaqnFhs1w5 -MUdupyHHMVZTxGiOxQ1JeW5eF6k6QenT20ZD6Y7yOf5T9a1bjM9JfwIziD5TjQYDRyqf++JCoqtP -ZrKQjrjn5DK16797i+wGpk148Xzy0FStEmigmx4pDaHg9iFrR3HZUNyLBkouq7GNFasz9Tk9vq2c -lCMz3Inj+e3Rrn/w1d49KMXhjZjA0zujd48EIQOVzkKnQpG67iyBfh4cnKGYTTj/XouGhtWzErTr -X2X9TJi0hKcpxjoR8RQlpWzhwUXsF5XOA7Uv01B/LJRkk8Jr7Fuk0d7ce0TUkcxBSQ== - - - 778nfNkYAzzDaBAyyv4RSW7GHwGmXK4IzZZU+MjrzQOT47kMrWNW7ARwLfXw7pDjARTnPdmF91kV -LKMHQffCe56HuyYeihvdZMJH769p0J2Mn67ljqt0L3hclciMgpo83Op8KDHvzFtYTIAB5PaGa3Qv -foys9EeZImm4luDOec1P6CDcc3Un6JvACXL2ccj+orU4CQ0f+2A2e/sRlDv42G+E86WHiBrXgxwT -DMPcZzhpHuAZVnvgx/gIl1eED9LlevgonCwDjnioMe/pfjpcCA3BsyFwP14X7gxVHxWzyOS4SV4A -wnsg4VOA5sztG+h+ZwGTvV+Aldo4Zd5P2mBuPOlTuttgz8JH968nkGjt0OAjXgkfldg0oOZtGrii -k7K88CaS0R6Blg05vmjN68s+7dNMqR+rk2Ez0ZAk43QGLyTDuD6R1hw+dQhG1WnfKA5PcHp8k2zu -i6nswXVkK+odOMBjFH7wi85A9FF0JEILdxCNX3RyIJeKv9FuZC7toJPIoSFHeCtnc8RBOC5ReHiG -rk0xKH1ZCVXKzEUCDp2MFQDHoyO7DxrvgyXiAuc+tQvSk1+QAQONM0K8mBeVkAhNhhgK37iaKHpJ -BkSqt245IHLpJ198RmSn/zKIDpQCci5HYS+wFqhAu+eSxrZu7fQG/nmNIQM0GEb30wfpe+0XowwH -8ZQoSfwXM+wZ9QIZaM1eh8QwxekZpNy1CLd3fYvgwrO8TvaR24nWKOoEYuhABEqINkEbxnOaSyvL -szAOfnrzzd5Ho3R+tttSxB4lXcBQVKfCaLI4UZ20p1Y52SJIxnPdyMjwCtFF84ADaKqvT4nPfGt5 -MCw/9ZswINSmFTZmXpdvOTH+9vgWlpisHSFDEqdxmV/uA2Jc4roIPd77EOJ+zAL3AHj31QN/oyVX -/x6J+hn8LYx/k+LmUdIFOQod4cCg+NnFVGT8K86LQx3HGVQVIa44wDcoHAjNJkoMB96XWRzA49gO -ZJCaG80+3BD0iyID4oLHSoteM1hu8qoKIPZBa07cKXyQvXzpBhKwCo33lqJnlOQAQ7dXSgGhQtmI -G1qRQarvdqdEMmdTaM0jKUBEP7M5tPbdYpQyWwnKYucVenAjHA0AS5Eq1U9mwLXLXtFykzfML5i4 -1YxXsh4ufZLJoeju/wekdjyepF2JCPgRulmOOf6KH34Opy7/zh/pnT9C+TOavp32ZxWe49rcfxal -WW854aYLV8oVyreKZ2eJaInrzfoc/IA8KIPYNVNFlMKFRDgRe4pNnk4C75VZ/D5M9fWhd3ZaHd99 -dQvvF9f5vH9KvwJ9cZco7feXMJ+zVKy9vCK5abDzxiiMX/pIVke1/ZsMW/qgHrNac+143v6GllJt -19cLHu76O/3nXT9Tae26awIcDXzyiD04bJqoN5aIgy7Zm4ImbwnFErKxw+Ky9FThHlDPi6/Vm4fY -ZbG/J0XN+mkoy5L7o2b5Phd+Sz81plkw8IeXfC222zW0BddTSnhunOulNZUSRuNcL62plDAa53pp -TaWE0Kygl9ZUSnD1r6KX1lRK0vJ0rkTWUkqiUetYL62plFShVAd6aSWlpMQid7TncRypBIC8PFcQ -AKnXq5kbBcsLnjHfBKIgBs8VKJSpYFsvALRn6R5jPvTmE8jh8UgDac7EpQi8JMwlhYc3AQb9gqHh -XvMImPcT6AxSlDsoSNZ0EAc2UC4gMq5x+FzeK5NUR82vxNrBF3dwlmro1IEcdBuCSM/BDSiYEFoL -iTvrBinANUpmlCMimxftrmUX2W/txhoOjKv31PCzWzooSgHNTlpIUokNiop2z08N5EEMsODnFRYK -2ccZEpMeHMAmZl/aRNWkI4j7qIr7UNAl3elWxiWhdA7Kb1E5snutjdXgHfsAGR3uJc51EeaFW5Bh -NDURZp6PeKvBSC0/kaLYM68mLw0HwwMXRDDcnXwMKwFEFITdPSwclCyi6YUQAYCuPFRpZUMJJygH -J1BTuZGSCg2zt2XEqKGhP5VFrC09u/uWnj3yoeHV1Kdsj4VP7y7PVUuAjKwqMU4puGoTWcXn1q4a -WVWFuZX4nGUwzWMazVYFi+m5PKQ3uAVBxIuZT9U50qPE3Ek02yRS+aKLCgaIaDaA8S5FszMMmi/0 -wt09uHkByj9S1R4EXXvPLJSek91GWJUw96NFmDvVXGwS5kaXsiFOW3XfQneRFAaAhm4EQBI2ZjBQ -xvkmnUApsgAAJNq6MND9Bs6oKW526WHcpkKGMEAn5sQSALab1wEzoqyH4qHPEchbGncfH68uH+Z9 -cDNh3sh2wOvRwJNGo5kyU1LBfVRaxFWtFRRckFTfRDugKzxSn77oHeU89dj+YeSy9E6yItuJkX9+ -cXF1WluG/PMtd0oO6XgQ1xCNmibIBg1fmvzzLZ4h//zMZMWwKTDfcRiWjGgZew54NNuPaGk8B5wE -u/2IlsZzkENCW45oaTwHOJqfEdHSeA5obn5CREvjOUhE23ZES+M5QOP2Z0S0NJ4DZujtR7Q0noOS -a7vdiJYmnIUDw9uPaGnCWSjy9BMiWppwlhiu23pEyyCcBSMqMGjVKU/7ZMAKJmGCRy1usZyjJtFO -gfscThvsDw4IQ9qF/6HAP/BnPOmimYSLiUbBH1H4tNHd+cONWrtoj6sBExQ7oTy/KA17i+FsyvI/ -XCn07OGicXtWcqVcuHUHtE673KBPVAc0B688KFbWgT3t7PxBufLwx8NfO38spX8p1xX4EYxFwnQ4 -7qKC4QT4LQJ+oWLgf3HYS+VZNJKkGPDfeCRKJROuBxZ+j0cCwP6Af9XBb1/g2V+uiOvC9fxKufo7 -4B1YmnSEDiYoOuwKh+NBKhllXBP4kAnGqUTUxSTB23As6QImcDIRpOIJGjxLgpcxGj2LB+k4lXSF -I5FgMhZJwGd6iI2dPz52/riFHQFI+zt/xFxujwveV6cMNYo7TwUj4pjRGCNxOEg4xv+fvXfdsWZH -ssOeQO9w/ggYD+Ca5J38OcbIQMMlCJAhQP7VaM2csRvY2S109xi2n96xeMm9M7lYJ3fWZh3UpyNA -0un4ageDwWDcklw0+D/yH2V+wb754MxPOqo36wJkBsn7TElapSZdwl+JxHbxptL0YuXvZDrJiv5u -PbdT8norSoCIXovim7z1f7w5FeQPsCgijLDMQrs3BXvCMCZsQj+OPBBQaN6JdkGLXuWJHLl9KPTf -P9hUWFyEop2PIm0VfDMmK9NyCYKXCd6tSVdrgnFoLRJifZNJqVmMD7YsevRLtQQhivlkokmu0Myb -X5LNpqW1DhtRxSBEGVgEa0TlY8rEaFwaaWKgsX7p/ZsMZ6x7c2h5V4pfQPNvi7Wp0oLKJu3EpJ1p -E9lPuWhb/fRPbLOsbBMMdgvbVXT7/a+yiv+lLvB+czMb/adPbKzHXQQbNeJZxMEYLaImGwaqJAo/ -MpvgB46yVXnlb0FyfnEfrPNhCh2zOX7LKggX3mwU4dbzViEbXiwfvgLGqELT8I7fKZGbTLJhFpNy -VGk+7C65VwnbWPZjcQ3Vg+1FWIkITxh6x2+W5z2YxHp+68v0VFTFKGzc7OSR2yShlZZFMEn/pGVA -45TP2j54/YFLpL6zZ3hKcqfFqSJENBmXYvGP8nuxI51zEFiU3uRXAU5ddGicdlX+zohPu8Ce47xI -3dn5J6T8QktXWr0tEQsva6xDUXq/8EMToYG44/l6x5jHCMnnMYIRTa1P5QqdiDfG84zcl3NupZIM -rdxPRv7DK2Wa6juTZcbAPHnPceqGPRucaG7Ty3o5PF2weqb6s4Hp5HRm2DxxkFSPXMQXusjLGQE3 -+k+Ie133F9z8IbavZ7P/KqRPYkFGpmCd8yxZmGQzDnWWjJ/U4rfi61Sd1XnEG2M5cZfuVbaOlEur -SchphTt+boJ3fBkm6Xw38FMFb6deOpevK9/pKjB5qGHQoEozBJpukq4F6b6QwpEVZyQRJztwZCKl -eD/ngwcBmgVy6oFPF+//ZdRV1D/9w+/+9LfcRlQ//eOf/vbHf7z98Q9//eOf/s//+PPf/q8//8ux -pYhWpn56kO3nYj8fSfnvfy8yoIv6+9xpkP9pRO8BRUgUNbmQu4j//vdRUszgHqjvj1RjHqkbiwF5 -z2Pcff1Fwt/947/8+b/9/JP5p5/+w7/+68///Lf/6ad/+N//9hfR5E9/55oafyp/9Pvf/emvf/vD -n/7559//0x/+9off/+6ffv8f//Df6990fNVP//C//PnPt5/+7r//4S9/WP96/+ff/emPf/vjH25/ -/P9+bsv0P5tFDMuJkfzDf/75D/KTf/nj+p/+9V//+vPf/o/6F0tj9pef//nnP/3t57+0X6olwu/E -7pf/9S57N41//F36/X/4f37+53+DRPtJtdn841/+8odNQb/76R//7W9//uk//+GvMrLIfVdRz/c/ -/be//vyX//vnf/n9//bz//v78ld/3Vujkj//05//JLvJxrj5tH978GywpVf5N53ExYiHkuHg00Lu -YYHoXPCZuPiYvXUmeklE8mosptD8m00yrvbmzdY+MohOfI/2essaQVuc1vkPF2vKHzoEDxSJQRyi -T6YRlxhSJooK7EZE3wlEv/hCtEkcroHDDZJkBbURrRVafNOS2jeaSyZmogrGtOnsJ/7g5/Jck5Jt -5G3pd2StyJaKiL2iAPkf2xwWZ3UWQnnrGzF5WQGImyS/2/S34/mJNuXlsqufxDoQjU+CTrfj+fqs -QlIyMckoUc5JpiahJcsNohW70U7cnoSUsa1Qq+p4TkrlNKLwgsgnA7noNtl3g39k/P02ObKcpPKd -drPY/s1rI8F+EUNbSqLMdyJdh47nDLmPIja5FbKzBd4w+o+cRT+XjuUkdWtrc8vMxyUnBU+4F6Rw -RvmsWatT2NS94zm3vu2FWJkQz/nNjue0XXo0kfWZeCKzhJHjxz6WYqbnOEt0ye0lukqhgA80LhXR -jy5i6EtocO5YTu2mYTixMhnNbx8duEmfjq0dy4nevTf662J+qc3L4Clg6WWVWxezX/qhkbBUr2M5 -wVdiDG9sHiOZUMQ+nYx2Et4YyzNiX8/DgpYwk78Aq7eo7oo/Wiw1BerXe5bTjIbJft7L0zz6mvCX -3c35YHtO2uvB9mnD79wkFYaK/To3eT1FoMZzXdrrtnPF0x9i/Hq6uKxiuvJNVN8z/iPLSTZjgs/j -KpXUVvKdquY7v3hjLCe6mr3O1pF2ac8CcmqkQPLzlgJ1LCep/HHcp5oqnXLZTD4U+pUdcL4ERBxq -FDSs0hSBJpyszKVlOy0sadlGk3K2DUeGUjpEpxzxMFTToE4c8Y/eCddR9I5NoZ1/i96Y0gnXBslm -fCC/78hmAdk2cmMyIO+ZfPNeOL7yRGSYT/fCtVfYN+oH6YXv++CvOfqtrUGUcjmYy89iifCyR4MK -+cucMvUYhOzmjAKB9VhKtqvKiVpx5uJi7s2CI8vXhxsJnOJOcFhAqpzgTDlTC6JOpQ== - - - YNP4St9EFH+vo+gs1Q/2oPkQM1G3z9wdy0kRHgPFGEuFlj/VrGz0oZw4QKuCy0Tlkm7C73l+XbSU -5U4xxPwxVOuWI4oFIfaBqNxSP18I0fqSOPrUrMW9maDxvViCj1JhI0YkwkKUAiW0nyejVSYqY+JY -G1xv3BAWY3S231iOS2aaNil/yDXGNpoN+G4vNIlgm53vJ/4YLbsttLKdMdpDbLPRXfk1p777nZVN -VrKWxdicyUmZ6T/SaKf5juMMJ3EUsEptUUKDGN2iPlrzbiYdx0muTWkIGLem7GkjUUEmoJAVil6d -Kl3/nuXcircXYmVCPGP8Pctp3vloH+sTPgG/Tha1sfw6hFKt9yynVev6zYqcOcn2MmTT+z40jNwm -dbA9z8ltKlUMQjv35hE41pFRn3WRPctppsPM/rqYX2n2WObosPayzC4spnQ4j2s/tBIasDueE/oO -GMOWi5iyRUOR+3xO0Yl4Yzynmvx5h0/zB9jNYpzOlXxamt1c8vhX7AajC3Ub/SlX/8GMHnnOsBvi -Z/qBhyK+0NF84tvzceVHOeZ5h9Pz/LpCQuN8Z0TvSqFgVW1J0hJ1JuLM53ulqZBJemktMrJnqQOi -AY3WT7QipIkrzQtp2O8ThHc288dK4pylvg82PY0g1FK//GQWd3yn5T2vg1l54n4h19N14o0tOc0e -Jzm+x83TqvVzhXm3zW58P86KNb2DoNql7YejK6HLMEnjj+M+1x85KpfNZCz0d+uSa4OPJgk+V/7D -qXpQXEVJOq042438viMbBXL5BvLAZEDeM/nu7fG0lDk+3x5XC+Lbb93xYXdc4bterP48GFdatcm8 -LbL98q0OG11JuK14fr/YfOvUiIMoRHy3QwtJLM8vrhA7nhN6SNrVD0Go0TDwWon5Ngocutd3Ecsn -P9GRrbfuQIweHbsk/5Hq9aojz1mRVSOZCkXORaLoJvxu9KGcFn27oApxuQu/5/llaS3W2y/44I1r -SLgE1WzIeV+ITUgQvSt/uVhrGzEhAJTPYLr2re3bspSegl1aL1vyJafqPalo7VgZXG3UELykWxqX -2KRm09FtRJgdiD6Z7edL0rEQ8bH5xqb+kNf222hlm2O4jeiGY1vzi1rk3e7KVps/zfsc0YO16gOl -MvV3PGe4iqOITW5lys0+vaSP1p1NpuM5ycVpU84pS8Jf5D5vKRq5wBKyamOonwE6nnML+F6IlQnx -3BboeE5z00cbWZ/yDfJz58uvla7XejuW04o3KR3lf+GgXdP5PjwMfSf1so/sJkbF3lZOO0EVMKrK -qe9yt/YLlnK9zbmXYB1twstzmmgsNqjS8Um6ffx8WPKhXbAw3XGb4Bsxhtc2nyM1IWwpx7lEopPw -xlieEft6a8jj/mu+Wi5+1aniXPr1pjZM3XjPcZa5UNHPO3WaAV0T/joy0+nYek7a67H1SbvvXQyV -hUr9MhdzPR+gpnNZ2OuGcy0b2IXz9XRNUCVfgoRao5RUd9bRDGGSwRhfTig73z72ny7DOqd4Yzyn -xaWj0taRemm1CTnRwcXPt5yn4zlJ6buBnyuIO/3SyXxdfU+XgclDLYMGVpokHLNM2tOgXRpaR9Ii -jWbgbCOODKWU9mf88DBQ05De++Ef/aA4etvOofwI7s0sBbsUeCemnGneyO87stE7cmMyIO+ZfPNO -eLnzEOwF0BSXsGt+Oyj+QSvciv/GhRITxRfHerbMqjcYl5WdalIDVs4YCMYJs6XBporvEi+eXD4H -emPcXh9nghHnDrdlJEVyDaoYMwclFZRLyJbwRyKurSc+AP0qsUimlfA5tkCAH5hNiumApxIfl4cx -IW1CPw49kDChEQfUJKHlKyE3wu7roqIFqhxElAVOprYVhZihvECMrYml6kVIoZkU7vhuElWyZWnl -zZ2YMGuxOpc2osSWlInRxDRSxUBl/eK7N40v7wbXqKNuJI9PsLBtU+GsnRh+tmkPm96msp/zY0w8 -bJWVbQK+WciWIhvvi/C/9zsI5qnFaQBRLYgPTRVymCiR6PrAbIILOMpW5TVQsNBcPQY4WOHjHDp2 -c5yWxfGVgJMk1lfMyRMmIXs9XwcUbgUw8Ua4za1fOxFWIsJpG++4zfK5R4NYz295HKeLeXZJZldO -8XT8ZtV/AB+0C3I7WxqlK/H4A3dI/WbPcW6bCfVEzJiNkoW6Jn9nxef8X8dtXojujPyihF9o5ECd -XPCpF0srf5cajuV+vYeWQWNvx3NCsyCPoYqIeVutT6UHnYg3xvOM3J/A/Y7APIVDwD7YEESPxspM -gTnwjt80/9LLfdKb08zmmtyXwcrPBdJzkl4Opc/ZOvGHTBQu86s84iegvomdXxX1sr1cevxjH8PX -s+l9FdLnvBYtO1sQuzqOk2wFyAtQTlLGb/XVuVqqc4E3xnOiZ9krbR2pl1WMEBOTDICIrnjZHcdJ -Kn8c96mKttMtm8nXled0BYg41CZoAKXZAM0oWVeC9Ff66pDVXyzbZvtvZCGlOD/jeQfhmIVt5nl/ -+H61MQ2f2z1CfOsG5u0eIb4bNbodlndjMSDveHz3brVfMJkrCN8BPudHObc9A+FbHIy4op+MB6Zw -aVOBmDGUQFzq6edM9MDV8st2pgEIVbKhA6R9s9rcYasWeANlJCOI218u+UiE/OVi4obH7dAyMFrL -QMY1Yn4AAUSJyBsYb34qAUS/VFQvG4HGK8buo2RXFYoSxPz8gk9v4mM2osNLByAqH9qE9lN/8HJ5 -tvl7vHLljGnWi/g0RC6oQCe/4b2KNnQWQnm/zSF5VeYgHvmuwR3PT7QiP4HxfZzEOhCNT4JOt+P5 -+pQCyFwZ+MsseLwg6gbc7NwCuC48hvFgQL2tMKvqeE7K4jKC2ILIt9jyRuLKRv/I+vt90vGcpfRH -/Wa5JbRo7DAnyc/i9Ad7ka1Ex3OG3EcRm9wKpivE4LX+0F30k+l4TtI3jiegO+ZjRVU/72HwnorB -OQVRrTV6gyff85xb2/ZCrEyI51xnx3PaRj3ayPpMSJFZLl7SefxaZnm3mx3LWbLjxAqOiGRYY2c2 -fPW9lxj6ExqhO55TO1H5eI4HRmLYLoZwoz4dYDuWE118b/bXxfxSq5fBE55/yiCvtQPYL/3QSGjC -1/Gc4C4xhjcpj5Gvq65P5aSdiDfGc67Fn/f4NPvEUyDlg5V+i6rZzSWPf8VujqM/5+rPzWiO3XRu -hmqSSvg6N/MJoGym+evSPq/416IIqxKbDF5arP2QclQTkQswLSFWxGBd3A6I7Rgk3bLU/9BwRhNp -WhrQ1JXmhTTo9+nBO5v7Yxl6ylDfB1uexg9mqM8UoY/r/rnjcncwG+YCz8p+Xh3/WivowXhUgWeJ -//pUGf+ZR2j2BrSe7W3cmKXRlHWSu91t2tZyONdP6rb3jfGcGON630T1S9tmnRejKzFJ6buBn+vs -dfqlkxnL/d1a8zr6hhMedmDjrqGKhx3YeCO7sEMVb0wG5B2T796VNxqv9V44Q649Mub0o5whn9CW -l1iWorDABzVdj/IAviljrIEouUWFqzPgF7P39zFsmE4m4GkDDWAwuyFpmohEUOONprj9PJn88C+2 -ediwtK2CdzOqPHeXiUG8MEQSojYNfjaUb/4g+hR1Iy4GL+UEsfag/EbESwf4Hmjak+VCzKkZiNpV -iKxu7o8JEaYbcEgiX8mJVTG4qoOILDowMWxSJJN5A1/MbwDS0WYIBvWWUi0DO563rwOLRnKT0Zfw -JnN0G+yyWUqNrZX5WNP9mnQ8J0VGDBRj0nkg7xuE7nH0se0wK+t4TmvX4Ba3Kam8t5vs+8FHYtJt -07Gc3DhY3pJFR2MBjkS7S+eFkXbZdNrGPxr90OZ7ltMs5yjm+sze7OW8MZ5nhL/+Ga3zOetAWqb+ -4pyc2jmnnuXrs8Let2SrEY0t8M1+2flP6sV7L9TxnCH3UcQqt03QohCj0+7DQNNPpuM5Sd8AizAO -MJUV6uh0aOL7ueM5t9fEd2snxMisqf1f2qyXPM3RRNZnchH8PFkcp5Gfh1DR7DueE2NUdCWeZJzi -lQSZYTSi6d6R44S6E0MUYFaPYnF7JedkQnqU8MZYTlP4AkRnn5sh4vLjL1j6YQvTPLTnOTUt+MDh -/GK46aW9J2UXHM6TZkPSmV53Q7lfmM984sv3UXmj4uR8WtPz/HAOrwUZX/L5UuNwljS2BUkLMmSH -V+8anjiOu6IuFaJeTO2Skj3L3A/LmmkVQOsamnvQwE69du/f3/t5P5af56z0fbBnaNijVvprd+RP -+cGnZjTyg0tBwWBeiw94lvg1LfnegtbTfY1bb2s055jkbXdbtlUv51pJ3ea+DdzArCh99EtUt7Rf -1nkwsgqTFL4b9rmGXqdbOpWx3N+uG29sgyX3O2xz00DM/Q7bvJG934GYNyYD8o7Jd+/GW3Grbrny -9OeSEFh/a8YPUalVObya781E07DDyhcd0JbWo8XnaV/+cAMmFmLCu9nlc4mrz/yZ/MBVvsKztGau -BixmLEQ80wAicOHwbLKxcIam/CXeAI4QCMRUAdZALN8UlQzekKpxCwTJVQzwixsNyZGQmn/Bj5f8 -TjmIS6ydz8O8HxKhPNWUhRV3FZtS1JuKNewFEzfUY+fQeon+zlqmZf1SLk4bF+7q2/G8/RovrXST -WAei8UnQ6XY8J3SapJIoXyTRBFgqkCmI+cYVordvYL3UUphNdTxntWkAm4aXvHMrQFeld6OPbZ/t -ko7nJKXv9JvlNuVwECJ4qMeF+U5kC9GxnCH2UcImdn76HDnUYvzYWZCpdBwnKTu37XDQRdsGon3S -u2hEfVWsKQaz4WbuWE7upHYyrESG55xmx3LaFj2ax/pMLMnGbEumqzfSnuEsyYG/qHV54mZZaonW -eYehH6FxueM50TP2JnM6fAJL0nmdU92lpSnXTOZyR/IowjrajNdnNdFybNClu5RwHG1lSz80Epbl -dSwnOMqQ51WeejJRbRnruTy0k/DGWJ4R+xOY5hEQqDGfU9Oufp4nq05tmXn1nuMsm6Gin/bxNIW+ -Jvt1SPOzcfacsL9CnKVrQKU97TSvrcFz+5Z5SqrO61OZmB08xvf1bE1ZZVxCPpSKGdQncA8MJ2kb -b5ZAs9srROdL+M4j3hjPaV7mqLN1oFzaqICYGskPfq0qZk/HcpLOdwM/10vp1Esn86HcL4WGoavA -5KGGQYMqTRBoukkLXFqy05qSlmw0KSd7cWQspTl0yo+NAjWN6MSN/fAgMdE0PHK/AzXXDb3c70DN -GznsyBuTAXnH5Lu3wMsFrL6TfQLUPGLX/HYgfYxRLS5cKfeTlf9Qqp6/AwwZoF9BzHXzrRLFsqyR -LRv0HUE14bVeqTdMak/64FOWFxtEeDVm+3Vw+BSHyqRW4MCjtuIR7aK2O8dAnUuFJOI0ZOIQTaG5 -UGApkn2LLliRMAjfAugGmg2QOr5prTZUY8CP2XzVX1cBj3N+9HGYZsqCWggaGoSfZA== - - - YyFPXoeGiB2c1IOQoN0UAsqsd1lQydPMprYdv9uv0fw+TmAdSEZmwCba8Xt9ShGM2GBGTTRv3pQz -N6A5vJURbXn6Z2QdvRF17CYlcDJOQMQz2ROXM5Xd2AM7J9uhYzdH0TulFoBwo2XfW7Ns9s52HNF9 -x26CxAfpqsBSOWVSMGHsD8gsjuzmqFjLDtJpu2l40n0AJ9BkbEUrDracJztym1tzdxKsvQTn3WHH -bdY2PNrDej4+AE7RR5V/6++w93t+s+o/vDmkETyDQ7URq7r3TmDgLGiQ7TnOUjkxlLMBEUCTwfuS -zjqdPmEr15HYjyKsfPtdn9NEmynAoTguZ5NuQKb7ZR8aCM3XOp4TmgYYwweXx0iLDw3X/GRK2Yl4 -YzynKT1IJBGLEKchZlSuYZ/0iyyd7PlNtfaTEemcpFdj0pPWQvYnlYUK/cIder19zWzmE9I+bzav -xk/WESEIIICmHiaGkEZiFYj5qdT3SrSoJwFLFsMdFvm4U6nboRGMJcYsx2fpKEn4WHzv8oB3NunH -2vGcib7T7cKiHTXQX/cIOXEcpyU/q4p2epyNRRR3ivQ1p8Y7k1nPtiBuzLZYMjrJs+62Z+sOnGr3 -dPv4Ntjx0x7o6JwQ1S5tanXuiq7DJJ3vBn6q79apl85lLPZ3a52jCx6Ka/dvsWG4REBwmTvx/ZFo -DYj23kXPv+fUHYNv3iy3Ck8WuSsvgC4B8VP/1iwfgqpLXpGsBBaFdMHbDTIKd6FA1LX1lIkAGsZq -hJA2rMqCmuwlj6nfwzMx40IL8RFxypsYMlHrpWB/2fwtDY7WAK224i9GmRc+vwnR6Dtms8cby0iS -oq6/DuIyJLZblQrqViOKe7K4J6OXO/h6XEImGquq6MeZP6Q9ebIhS+vRWNENs1DclssasEGFTTAh -ZCGEt2nzcjZ/3b53dXuet18JU30/iXUgGp8EnW7H8/XRBeBvygIw0rm3aJfYkPCUwcdW51G7mLGp -MJvqWE6K6BmGL2WERSlIfdV5N/rY9tku6XhO0vlOvRWaXOPhIdl58ssKcce3IlmIjuUMsY8SNrEX -pTMxmTD2FWwmHcdJylayoXIXztXHDs57FyCDqozyhlNv3m7a3vGc2w3ohViZEM+5zY7ntF16sJD1 -mWgCEFVZ7vzj/DnmRjjOklwqKrUkvAUGcb3ZUEJ3DmLoSmho7nhOUzuzmdMBFPiU3iLZsKgV/Gds -5joU/FGGdbQhPzGvicaTAQ6x0I+AxvvVH9oJTfY6nhP8JcbARSQoKJ8DW5/KRzsRb4znNKUvpdpF -2yHFYJ50lDQT7XieEf56IpmHw+G/xykwq6W7kYamnufcfXs+5I4V/ijt9ZD7pOkzf9Mt/1DuF/qb -66kCNZ9PiEsXZGKqsI/27emVX64yq/B4YAOfQqLRPH+YZDb4viDDik+8l/rnqvrON94Iy2n+cq+x -daRZ2rmAkBngXv41OJ3YGkxS927Y51orR9XSmXwo9qvfPTiuAJOGWQQNqzRHoFknLXVp8U6rS1q8 -sdSc7kFuJ/XFg1NueBjsaFhkbvhHPz6u8S5oWUtcoGho5nZHfN8R7fJAbD+nxMeff/M+eP7gawgW -+SkUc9ktP0gbfN8C/9xH4GalgGVSTqUcvbf3S6yRXDKVz/QGn99u/66gLBu4hIgHbFO9nRrwTRgf -aPGvrb195Pn6KAM8sQIX63EZZdkQTxdtS8XziJKbn1I2Ue9Qch1eVQPRKlvRZo88J4X1DIYWALTm -cYi1PG/Sjz6UU1ZiWTBNIRrjbRN+z/PrYiTwE3Fm2GagwDvQcl4LEPMZjVslYo6wjFhfO8/YqD63 -BnxMdwpgs4T2iBXmcFcLRFO/WFNNcJ1RK5AIpPMpBrx9pcNGlP8nE51aNmh9nFoDLb95c2PTfgyS -3RZa2cYgW0gPNxvdll+Hgr/fWRXceUlJ5fzN+XbHleqUab/jOcNNHEVscuNtdySji3bpg2Vnk+l4 -TnFvwh4Yjd40uMJzRqLy2Y2gs1Z9cg0e9s5uboHbj78exh+FjZPTmeaTj0axPuELMp6pQaYrNiHV -md4MZcdyWl0uqo2iMKTUUdfjt11AGDlM5ll7lpNbUks5W5Zf5UG0WEemfNoz9jwnhvPe5D8h51fa -fQb3zVCLstDBFs33qz8yExqpO5YTugx5jCVkpenFbfCoZzKJTr4bY3hG6OttZJy1kzGleDO4pq2a -2juLpZZwdOg9u1nmwuT+JfeueVVwuyz3J6DXPwyrg/KFCnoprD6NSNs5RSoIF/mFTvF6v5va+SfE -vW4013KCfVRfefjvS4Eq+wLMYogppph4ojDJbhDkMbCRmm6rx06UXp0bvDGGExOZvcrWkXJpeYnj -CklSHvxcdGP4MszR+H7g5yrgTr90Ml9X0NNlYPJQy6ChlCYFNMuknQzam6EVJC3PaCpO9+LIXLbH -BU54ZBKgaRSnzviH73ob0boGVg3eGdfljkLFO8GNoI38viNb9UjemAzIeybfvf+dTHmB5BJu+KLT -j9IAnwMcroCAlm+LubCBZEtiX26V+dCwv4WIBwDyVTPdWhYITfiWVT5R+I2Y8Y9hu3fkcAkj9UKb -b1cy0V1CoxK8Y2g0FQDJllS5dtWI+WOclqHvsL9aLEPkkdR1sfFOzCTRh2kkj/ITxHYctZ/2g5PL -Mw1ZVkkLfO1OJ7x0sbic9iSltwkou+BGSwDvejsnFDQwSCvudRtwz/MTrctPAIcfJ7EOROOToNPt -eE7oBmpTHmnJVWwsB6kzMV/WE2IwyYwthZlUx3JWDg0AsWRrBb7oDch6P/pHpt/tkY7lJJXvtJvF -1m9hSS4nb0kv9oONSNahYzlD7KOEm9hLSaDFCaUPXEU/k47jJGXnowp6KTcs16ecC1D2VEYnlHzQ -hg27es9zbqHbC7EyIZ7zmh3PaZv0aCHrE8EEgIQ2lTqn3UbpOc4SHW/wALoUx+RUqF+mOg8xciU0 -LncsJ/rG3mZOx0/IqfKpah8g52ds5jPQ4XsZ1tGG/MS8pvV3loIpiIVeUhW+W/2hnbBEr2M5wV1i -DJtLJUA+O90gWs+lop2EN8byjNifAg/XFsfQpBy3ujbW2LJTc6a+vec5zeNgIBx4fRT+vKenmXTH -c4LZ0K3aDTwU8YVb9Tru+elEYazlRxP5NRIFavuf0Did2LSIdYz17YmRXy4xq5zeW6msFU6815Z4 -x3OS7SOZEf20m2JPVPSdd7wRlhPdzV5n60i7tG8BMXH2GD/PP6HrMEnlu4Gfa60c1Uvn8qHYr8UR -Z6vA5GF2QcMrTRVo7kkLXlrB0xqTlnA0QadbcWQsG5D4iaAyDNo0vLOg8qO3xdHoVnk1w5uNyt6h -xFV9wzxT3x+pVu+olQOn7jl88454vtIQr4CIh/wY1m/t8IGXM+kt4q1oi/ii6rNEdilgbCAupvUr -CuCa5PYSL21t4CEoZdxBwIfd4cLh0i0+NeM8VP1xwBv3+MNFuQIx6wCDKn/otHiCgiAuPgztKKEo -vWykiM+nDnG6fFNNBlhk4liSpB+uHEMFzeIjYEpvEkpj/a34tJhpylR4q27Gj84Nk0wegF/inZQv -nXCDR+JxJjBBL+XtwHwTCKKKCPkmTpkQ/hWSxlhfJOkY3n6NNng3g3UgGpkCm2nP8PXpRNDCOYNB -4Ta2CxUqOr9TYY3DOzZmaCC9HXXsJmVvAH1TxuZxnCuq7sYemHq/ITpuc/S80ykExvkFyYklfsim -Lw8c0U1HdN/xmyDyUbwqsoJCASJWz/1Rn0Cm0fGbWxAGU7wRNCRlrG0mgu+2NgIrsIp/zsd07ObY -yE669bp0N8Ju1l482sR6Pk4EfJJK+adSqphmJjt2swpAgBhm3EBcCDUlKHeegDsMGml7hnObNiqI -7vJwoTR+V24HZwNmz3CWwZCdeV3Iy3vzmsl4FI9YYdsumHXLPjQQlrN1LCe0DDAGZJEh0pI2JM1z -SWUn4I1wPCP09cRK+bfoUeJie6ITuQ6slRkCc4M9x2kWQ0Q/G4VoSnxR9Msw6Cdj0klZL4elJw2e -uEYqDBf7hd7xE1DozOg/Ie5127mUEuzC+nq2SqyS6/xmjuxmr2maMMlk8nMhMuqSlnuJfqoaP/rD -G+M4zcccFLaONEs7DhDTIOWRX2cwMbYGkxS+G/epnkinXDqVD8V+LdQ/WQMmDrUKFk5pYkBTTFa9 -sjqclYysJmMJONmAAxupOP+nHPAgOrMoTt3vD9+8NqqBcocHUO+l4XeHB1DvRozhEb67/Z5THxl8 -99a113mGFzC9PbbKj4LpPQXMBKctA4KJB+SRVQ0wK9+/tfAD9SwmQMscPshZfW8dAvXU41kH8Z1v -xpoKCnbk+foQAwQmZfNLVL4gvlfkXvkpoJrCm1kaUHJA+YmPPOi1NaBkIQYXM1H84IbMuuc5Kapj -IJe8zgPlh/hWNvpQTmBjaZ9p+ZvhjbH8sviI5fYJMnqDd2TiZkIZaUmI2tS73CDiuWQYRkvTAWm2 -xAXfSgFupdSdmC8fAafLbT/3+dSKEEWZZqgMrjVqB7hZhbJY7Df5il4KImZvJTRabbafq6h8Jhpr -dbP0/dQfAmW/i1a2N4a7iO43tjO/Bs+k31zZaEXrCqpy5s1GbT9QKlN/x3OGpziK2OReoHGHdkiD -JqfrzibT8Zzk4fKpCPTNXLINZfqkpUgWmd9ph2qlAt3Qyfc85xa6vRArE+K5LdDxnOaljzayPuUb -5Oc568XPc258YzxnCQ8wQhwdMfhKY1RT/D5GjPwndbRHjlN7UwBH9DhWY1LaLpNwmz7tJ3ue0yyH -mf0n5PxSsw+4A7yovM5iwLYBeO4Wf2glNHB3LCe4S4zhlpiVJuXo9lrJydyiE/HGeJ6R+zrAiU/o -H4Tcfkpp0Q0ltDNaagzUufc8Z5kNFf68q6d50TXhryMqnY6456T9NSIuXQYq7nnXc20Znty+zN9T -jX5iMhMzhX2oX08XDFVOhQ+k1qHw48nDJJVDj7i01p7sOV+hdb7xRlhOi1F7ja0jzdIqFEIqpEEW -j/42vOw9x0nq3g37XJl8VC2dydcV/WQFmDTMImhYpTkCyzlpp4O2bmh1SUs3mpbTPcjtpIJ8n3Jh -w0hNYzpzYT96a1zHBt2tlgeQb7Mjvu+J/oG4/ZwSH37+3fvi+NiDh1KfBzlxKZ+G/60vPgb5Fs+D -r2E2+yW7gRGLX/T5E51Z3AbUaw2wi4wtYAyZiG94C36eIc9qm+/I8/VRJqM2FZQf95Z0w5LFQaVQ -KjWTlg3J2Vn8pWyiGNxGcy5kml0anuyR5aSojoFsAE6cwkMN/o6YvBt9KCdQ5hC2QDRmUU34Pc+v -C5Gy3C5AyCCJ6hLDZkLalQ+lRqcNC28xNmTDiL4+mCLElD+p4rGJ1F6UAxF5Ll6l0O4OpaczySz2 -A11wrTEzkBE1HjaK+RKW2YhKxUx0ymy/Xrwq33hlA2x2vp/4Y5Ts9tDa74zhFqKbjQ== - - - bsuvAvk+7qxssvj8D5A0yd+22VCVEt13HGc4iYOATeiocyK66PTRkrOZHDlO8mwL7vt6QM+F2NCm -zxkJfp6WEEoRE9Nd2Tuec6vzXoiVCfGU9fc8p7nng4WszzgF/Dqf7YCFJFfh2I8sZ9WLeKEVER+5 -ddTLhmm/Dw0jx0kcbM9xYlDsTea0G4ScBa53iSJnPSx2zWQu99U6GdbRfvzEvKb1dmDDuN+74HRX -fd+7W/2BldBw3XGc0GzIY+CrpahHL35LX09mFJ2IN8Zz2m6NQAfFjYHceFLPeUmWTPQsp1r8+VjV -1wRU2uux6jmzYTuVSkOV/MKN+gn0bGI8XMun/eWT1vPSIkKliq0rQydtY3M/NiFyCTHago2QJV9Q -WQjRhFS/CZE9Sx0QDWi0eqL1IE1bWVbIQn6fG7yzmT9WEecM9X2wbWgApJb65TeNuf0y0egk6HQv -er9rKeJ+IdfTNeKNLTlNHCf5vd3eaaX6uaq822W3wX6cldz2LoLqlzYfOmdCV2KO0vcDP9cf6fRL -JzOW+7t1x9HsrgDeaYcCrhvcd9qhgDeyTzu478ZkQN4x+e4NcmsxmQsnxyX+Fcz73zrkow65iukt -hOrWk3INk83jAW58msgASHDg1gOnKOWrp87YevEHH+xyFwkAaLVreWQ5oYukdf0OhHIn+A3t1+Oy -I4j5Sd4mocdfitgSPNVGDPg0Ky4p+Iq71fGcFV418qlaY0qtvCEs70cfygnQufwtVn4R1YawvGf5 -ZaktjEXlZ7lxGcmluFlQfvUa15FiQ5jDBSJT/nLDhk6IcEjf8RnMbrBoIlQq96WCv8PqoTLLF6bq -sUeqi5HSiBnY8rXeisW291UKEamXEKNvVwptmQaI7dhzP/OH1LbfQyvZGcMtRDcb25Zf1CDvtlY2 -WZl2xjWTeL4988N1yrTf8ZzhJ44iNrnzU+BITmIDMx8sez+Zjuck/5bfD8epo2XZ0CZPWorGg3Wx -1MSLTRue+Z7n3BK+F2JlQjy3BTqe03z00UbWp1yDxjtfeFkeP69XmHqes4QHbuGSbD5GJ9V8aji9 -+xAx8p/U0XYsJwbH3mpOu0PIKZlTKs/jxOUzVnMdGfwowzrakp+Y1zTbSeUxOiz0kgoyQL/6Qzuh -obvjOcFjYgybj4PjxeWwvXByLrnoJLwxlmfE/gQ0eACUccg9tdyHWAfrTu2Zuvee5zSzYcKfd/Ys -Mbom+3WE7dMh95Sw1yPuk3bPnA2Vhon9Ql/zCVxwZjvXpb1uO9feD9kH+vV0tVDlzLcpvWQWwVme -O0yyGm2zerY3fk6XZ51fvBGOEx3NTmPrSLW0BIWUCkmQ/FxM0dBFmKTv3bjPFclH5dKpfF3Jz9aA -icOMgkZVmiHQnJN2OmjrhtaXtHijiTndhgNTqYDgpzzxMFTToM5c8Y9+cBw97wLnHXeA4KpCf8cd -IHilhh21ceDUHYfv3hzH/QeJMVcgwT02zQ/SG58ACa7wTnGwMhwykAYlqcq1JBCBZnOrNI3nDIRm -2vtaClhOkgdp+MN2KlTpgmSjs0NcXPt51CpmYlxi9vjeFyw2XJ2pl8m8e4tOxAEpqXJ5FzQrv9Dw -UaGc6cAzwXBsIqb413L0ATT8xOCDoCqgdHg5WFwm/iyZiil2nPGje8MsncnziWopHwoUFOmKNha/ -bHJqiYiSgIsgRRs+X7fPYvr2csuR3yeamZ/ArTxOYOWSkQmwefb8Xp9LWFOsTTuLJyZytmzrZTnQ -GjgrtQ1iQx2/SZmbjBN8cnkc48oZ627skZ3326FjN0fTO61CYg1IQdlJi4KRpeGOI9rv+E0Q+She -FTnidVGhuYrYRx0CmUbHb4qWNRyQJELyA5tT45M+BP1Y5G3aIRcsBwo6dnOL106ElYhw3it27GZt -xqNNrGeDhPwyasm/8UvrSg3ecZsktZTTOolyrBe3YXXV9d4NcG9Bg+yR3dT+UsSRL4R+G2S0ciuK -2e/JUNmxm2UoxL6viviF9o3GC4A9sbbyf3PudlzukVnQLK1j+HpHiCGEdR4iLKbmm2fTyE7AG+F4 -RujLyVQUz4ann3V+Sa5YODNTZgPMa3f8ZtkKkfusC6cZ8DXBrzqWs/HznKiXI+hzpk6cIROFyvw6 -d3g56jOTuS7rZZO5FPf30Xs9VwgWsY0Vbw9cC6trunJkN8VUQg7mCe9OlGOx5yvuzgPeCMdZfuWo -sHWgWdZUyN+bkso/NrYcoO0YztH2bthneh6dYtk8PpT5lV1qpn4mDTMHFjhZBkAySFaXshKbFYOs -2mK5Ndt2A+PIvZtT7nYQhVm0Zt72h+9KL1C6xoIFgKnXc9tOlUi7Ud8fqQYgMDq2w9yNxYC85/HN -G9M64vOLMs83pgOMyvzWmB5eJkPWL5ngTxovnNa3KhH0MvYRiIsx5f6HryhJWIyWU2lf8ZS0wR2v -eovOV+QlUbxkjBXBSn4eFrhB+ctlKZc1cTdDRQ3fiHeiKyCa5A7BLjoTMyZSI6JOtDhoE8qFIUlI -4yKuS+Pd7/rsHIgheREzqe0tMvxai+fLRJG3SnSc+oOXy7PFu8Oy83CLrSA1A0dMw+VHFE3Bb5It -2fktd+xImZhXEgshb2ui9jxvv8Ztsm4S60A0Pgk63Y7n67MJ3BnTapGUTPvNZ2aiyCvE/K03jm2F -GFXPclL2hoHy29wYyLWDiN3oY+Mn26TnOUnnO/VWgAcdxK3oYLaHLAd7sV+InuUMsY8SNrHxhhKI -Ga957C3IXHqec6vCjDoRbVZTezUPuhPriqVb1hBpT/ufjuUcg9lLuH5KwhtjOW2THg1kfSac4Odh -iS7/3DuzweXseU4SHvch80UVyOa02exl7yKGMZdG547n1N4T7qcWM8E1TmQdK7eI88G1ZznNdvrd -+hkxL+/Wa5bjgbiJVba2wMP1Sz80EprsdTxf72ryGAu+7aLXpCqs8fl8tBPxxniekft6KoZnQ1Mq -Hb0QjW7XtDubZcZAHWPPcprZENmfCFA0lb4m/OVT2ueD1Tlpr0erJy2fOEoqDZf7hZ7yOiYLNf1P -iHvdfK5lCvtQv56uMavw+eoXHFN98rJnOcdu8sUsjLskFbfK71xZ3znHG+M5zd8clLaOtEubFxAz -6JR/nZ/cYOswSeW7cZ9rr3TapXP5UO5X45d2i8DEoWZBoytNFWjmSQteWsLTGpMWcDQ/p3txYCwV -wPSUQx7FbBbcqT/+0dvi+CwgJiirodP9AUy92KqKSn3fU8MjdePAqY8cvntPHN96zHIF6tssBZLo -x2iKT8H6xvdfeJWET+6hZoYIMr58oVtS2m7T2JS/2Zi35MN2E8vF3DRIG0RBx3JC9wUvgidJtVDo -BFUxBkGMyuVYngv/KqFX+EsR27d7q/hitKhMy/HpxljOyqlkIGfEr2Igb+rX4m70oZyyDgtun4Oo -9IZ4smf5dYFS6fIQVn6aZmkQoQXnDrSts1vh8GAV3sX6AaQC52mZgI2twVoh9nR+9r0+Tyg/d1F0 -mokphKEquM6YEQA4zrlsutHWa7YgBknB8S13A7mXXyuxp0zUrfN+nPZjlOz2z0p2xWj70I1Gt+QX -oZh026pe1lTOxZzEmYbzzVVKdN+xnOEijhI2sXODJOo7IjBfdDaXjuck14bXzjWuZVbM3fOGgp8n -j/M8olrbzp10POfWvL0QKxPiqR3Q85zmn482sj7hGPBr8ailugnWbOhIe5bT6nUlOralHsgt2ZVF -h4Hv5E62Yzm5VbVUg9BRhivAiNyoT/vJnufE0N7b/Sfk/FK7l4W2CftTFtqZqvlu9Ud2QsN2z3OC -w8QYMRhorQTas0lFL93twG6WqmMSb4IjcAFvX5jn3CPNJI4c527S0zHqlKzXI9SThsJcCxGGCf1K -x3I9rhK7+YSwT9vNyxEQgSkgU5eKx28IiGKVIRO9KWc+MxGTCfVdhPd+l1JHQ0MXrZVo8UezVJoC -0vjeZwLvbNYPdcM5A30f7BYaKKiFfv2FYebvmGR8DnS2lxzetWxwv4rr2YrwxpabpoiTfN3jnlmf -KcF3u+vGd+CcFIT4BKpY0mHofQddgEm63g38RAukUy2dyVjo79YARzfbRXwaMfEtIXAVnBJnCr7c -Rn7fk+Mj+c5kQN4x+e7tb28wmQtA3ioksUHf//K39nezVOVlF+cbOeLJw1JfmPISZ/COLj6n4CEA -7EmgKWEjl0/39Yinwuc35+XXEec+a2V9ZPl6l5PMW3XZi4+5ygRlWUKmbZiYEK9IvKh2Sxek/K1O -Fx9z67hNcu4JiZNK+ZBYe5z9MPJIQJUf+cgfWfOz53kqHb+vS13FPrRLptwucjpsRoPolK8XhQaz -V4Gz8t0k1QykQmyVD1vVvnwF48o3oCr0BYh6Mb5cgbJRD5UxVFu3/vmBLkgpRdpScf8U3qd2NhO9 -CxsxmGAyMYPZ3djMH9PX47ZZ2WYYbhu6wchO/Jqud7efYK2SrgVbSq1QT8gOFNopvuM3wSkcxasi -e3wPRhoSKtj4aLm7eXQcp3gyH1BOoVZr5+5P20dCwDdZqdGWXLVjOLckP0qwEgmeMvkjw1ne+GgY -6zN+IOHbWijXIJdUAF47jrOKBIPKz8RcI+ZicSXBYOgoqUvtWM5tn5lUjAEH/VIo98mJKZ92iT3D -eTH8aO2fEPLrrF1ZlIEu5AVuoFT9qg/tgwbnjueE0hJjLGiSiM6MU+Xb6/n8oRPxxniekft670dq -MfGq5eii1vVJD2awxBaYM+8ZTnM0RPLzzp1mPtdkv+pozgfXc8JeDq/PGT1zj1QYLvbrHOT1Rj01 -+uvSXjedCz7+GNvX08VAFVOCP1rhdivqOpZzjEYBDRrq2e5UnS+/Oqd4Yzwnepq90taRemmVCTmB -9Aw5t+yn4zlJ6buBnyuEO/3SyXxdXU+XgclDLYMGVpol0HyT9TP6zgyrI1mZxrJxtg1HZlIq+nOe -eBCoSTynfvhHP+yt8klEh3WM2yXtAmCiF/9Aft+TU9zQ0h+ZDMg7Jt+95Z0vLqgr8Nw6lAPwv7W8 -hy1vCeHW+viT8cBLMg1gyzgDODPZrEo3SOp8UcRosz20AEA2LZ7DeMCe1Y+cR4avDzRWl+tyZpEk -qT5IB5pKMdNiDJt4Fn8nIpugG7J3dBHT0G9p8Q2Bbc9vUmDHW4qhDGOs3aCQd0MPRAS+HN5PAC3i -B7ee3ddFRlniGCAhXtZ+NJq8Al6VxPZWiXl+QjRBbVBtkm2lbF4qprQRPTqOyhbcsPrzAvYkxLhU -2GWiCqoytvr4eCaWZLwkrs6ERlNSUEmZLLnIZtj5NAf+LpkCedfP+jE2dltmJVth2zJ6t2XY1qJ7 -8Gua3d1Wgp0q3If8yTjJFXx5PIXqkui8YzfBIRykqwIDiA60/JzzaKXJLI7spngwKeJlBzhVLGQ9 -bxm23mQwi9+e3+n4zS1oOxFWIsIgPpya0iwHfDSK9fz2t/Bq4lnwW2vjZig7fpPkjg== - - - yLFxUiQA79BWde+c/8AxUg96ZDe16xRDMWtkqhnAceUmfNoJdgxnGQsx8utCfqGVA4xTbCKvr7ZL -w5DeLfnINGgY7hi+3iFiCJ3rmZyxb+/EnMsTOgFvhOMZoa/jdkvlrsQ54A3SEH0FB+3slJkA891H -drMspZd67Mb1x2n+7aLUlyG7hyH0F+oRIujlCPqcjRNPSCRhAr/QEV7H6+6N5bqoV63lUszfx+31 -bHpf5DZ4gUaci5Rn5c3ejuEUS8kQCtBNjH5DvT5XSnWe70Y4zvIoR4WtA83ScjFLmX8rcka6AJOU -fR/0qVK2U2s/iS+rypnqe1mYIbBQyWI+yRtJD4J1U1gNSKoslk+z7TawioLTfcLLDqIui87Myf7w -LepFNYzt+AjTvTRA7vgI092o7pF6ZzEg73h88wa1eBOZjLvQoA4Z8/43RJIPEEm8uA6zyKY0+StA -w7/S+P6MA/+L0htAs1e43pXgY5YKKwyPFiQZsQAnSxVy6sDy9TEl4yspfL4L4c2bJW1IvAsQSEPE -+7thk9DgL+VfXVw2hO98tQlE1S7ndTwnxXAMlJ9PxkDbgeZu9JGcOj+zizNTQlxMgz8+8vyyuIjl -Dh5foA2gpa3ZTAiPUoC4mHo9FUTcfodhuLBUoE/5lcHdHUSdFNxGtPh4itBitG8/L3BL8pfLkuJQ -GwO9UUvwUpt7nw04uApIKsSQ8AAKopi6A8DnM98gKqtUM/X93B8iZb+NVrI5hruI7je2M78ImKTb -Xdlq8ca0lzCv5T98+kClRPk9yxme4iBhkxowkKDlLGy86GQuHcs5/k3h2brcCHM2bpjRp8wEcHAF -aE6SquRdU/ae5dxytpNhZTI8Zf0dy2kO+mgf6zNOAT/PB87wc+8qCE/Hc5LwQPhT+XAIvrjUJnwf -HoaukzrZjuc0zfdGc94RZmjEfOQmCHsdzXWjuQ42fhRh5dvxM7OaaDle4Xkmn8ph7JUt/dBIaMzu -eL7eWeYxMtAl2k3KqAaGejKt6ES8MZ6zlG6SRJjF5A6T1M7+ST/J0omO5QydEzvvBx5J+EI7vw59 -dDrEntLxrxBiqe18Qt/P285rQYBFBfnjH24S6ZQa2m0+uwmicw3wV4gxvwLty5Xr98GOpe6HRjNa -QNGSkGatLCekIb9PDt7Z1B/LiHNb7X1gfyz+0a329S9GUfNlorE50MledH3XUsT9Mq6nS8QbW3Ca -N87x2/ut04r1c3V5t8lug+04622I3kNQ/dL2Q+dL6EpMUvpu4Oc6JJ1+6WTGcn+3NjmuitT0cnnE -6zYVmbtS33dUiXlvFcLogQOn7jh89+Y4PvkY8hTlL+N161RuKPzWHR/jdeN1ruzPDdKvCpCkFN6w -SOFNLbreKwtvNllc87NvKdQ7Qd4XgBzjgFtVm2N7hhNaR3h+Cy8joMYJsr4NiXeJwB8VZ56jZpXP -4y4xhPa+gTfDDSqVibp+3e55zgqrAOsyQO+Ugby9ox/vRx/KKcuweJyNEGJNc3uWX5fRymJ7pAEm -f/m0qtnPEssHYlUrUJCSLnmD90slZjgLfDX2sth3YO5FI5FHRqS1az93EZca8QrEsvihKrjOqBVI -NhzhVfH50dZH50AMYvn4pmuWeppGfi4ZsspEXROCbt6P6Wy3f9Z+Wwx2D91mdEN+FVj3cVtlc5WF -RfaGGG5cTB8olKm+4znDRxxFbHKjOQJi/iY/XnM2mY7nJN/mUFEZYPm1i74nDQW/Th6vv4hmbfQb -yPie5dyavRdiZUI8swF6ltO889FC1ie8An4tZlFy22Bry6RjOa1gQ2cIN0MDGq9eN73vY8PAc3IX -27Gc27CKqeLtBTwAGbcZ9DZ92k32PCcG9t7sPyHnl9q9LLRNoXR8nClnnvrVH9kJDdo9zwnuEmPE -GPMYKTm1QWWeyit6EW+M5yylx4grADp3Q2KoHxDPOkqWUHQM527Xs7HqlKi/RqRiC0CEfWLDXluB -52yeekmmz+tT+bICAkPn9weNBlB2Cg2iOt+kA1HS7NL6BdGXP1TB164p2arU79BIRgsnWgnSlJXm -gzTc94nBO5v6Qw1xcpHfB5uGBg66zF+P3U29xml5z+tgVn64X8j1bIF4YytOk8ZJLuNx76zPlOT9 -Lrvx7TjraYvOQVDtkrZD70joKkxS+G7gJ/oinWrpTMZCf7tm+GIa+nbaQXjrhtWddhDelWwMyGrD -6q5MBuQ9k+/eEVe23Dm/AOEdxQbDbxDeH+CZuFQuP8OdB6U23OFg8ntd4hid2eC6xZGU+6+mvf4G -0NP8ucal+znQjufrfQ4QmvJ7vihwgjYNrjc/5ys01w5SQ8D8rQ1PGCm30XBHx+ApJuc3tN4dw0ku -PiGNwuvEyUl4KT3kbuyRkCB6vKUCoqgmT6fj+HX5rNiJxsPa+QKSq0+uwHjytSDcQAoN0nSBJdTr -S5KTF6IENjwfXr55tc4qoh0sCnekgtlw/iTy+XJJytWfM2UM1dYbgS1P0Umx8KaSNY0oi2Az0bua -s+DmNF5sB7E9PNHN/DGd7bbPyjbFcPvQjca25BeBeR+3FSxW5oBHshHJ20aj+uwV37Gb4Bz20lV5 -fT73bcpZoY8Wu5vGgd8Ub+bx3DcG2M7in7aNlB+UywqNphza7xjO7S0cJViJBE+Z+5HhLGd8NIv1 -CR+QH9SJLv+4vePXMZxVKBgpDEMtIfOziCsJBEMnSd1px3JeBDway3mXl/ETy6kRKc98jJet5Tr+ -+FGClW7Bz8xpmtWgGPQhL7FUFRsi5X7dhxZCQ3PHc0KBiTGW+mKRkd82pNST2UMn4o3xnKb0IP4E -pwiNOBYd3HPekaYNHcu57p1OgUt2es9enMOTdkO2aj/wUM0v3KyXQchPZwbnDOXp3OC1EMG4Nbig -Xeyk0Fli8z8ZYxcyiqwVIhh3mXQ5Tel0fbiRbVnqf2gsY3USq/pYgtpngCzSdxnBO5vzY6VwzkDf -+aKRsEet8+u73tRfMNHIFNhMLzqLSw+77FdwPVv/3dhSsyxxjpvbb5ZWhp+ruLttdRtswFnhsfcJ -VL20sdB5D7oQk5S+G/i53kenXzqZsdzfre+NTnaF4E4FgnttCCcVsDs9InM3srE7cmMyIO+ZfPe+ -N64eBdkvF3C8fTlE/1vf+yMc7wVPD1i8AG6qzxRisnhnwfu3FCuan0PSJrQA0OSC7W3frBI/ZzXe -LCi0nuHrfY5Vb0kh7fOSKzpXcXuTZGVCwyk33aQz8q8Q2NkK5YvnmKzJtCWWC75HbpMcvM0vfac8 -TgtOx6EHEgKfUDLNQquOs2P3ddkr0Pu8tbLCeJ142SD9MkZbJi7aNluQ+blsC257AxWHa/ElVoxL -qoq4EZ2wMmJmaWmPxok4SwyFGG0a6WKgs371JcuCmcFegy49oEyTEGm1kkDkNrhvK1PINGQENzbr -x/y12zAr2wmDLUN2Ft2BXwTjfdhJMNPlDVpbzJu2Vg01STR+ZDbBF+xlq9KGJWRafuVkvMrdHA7c -priujIpgF13uLKynbQIlV8TDT6LLBiTYsZvbAOlEWIkI5628YzfL9R4tYj2/72V6Fuc28FtfPkl2 -7CaJjUI+4MyDjSKrau8+7Lz+wCNS13nkN7VhgyNdMAFkqG7ZHtvoLPis8+v4zQvTnYlflvELbRw1 -qwaKuyxue9zkuOAjw6DRt2P4emeIIRTyHxkihpQaiOq59KAT8EY4nhH6M+jdbjFiA7jh7jadd3bK -bIB57o7fLFshcp914zSruSb4ZQjvkzH0nKiXo+izaMGdO2SiUJlf6BAvh35mM58Q9rLRXELy3kXw -9WyCX2RMBn0WwPulUlce+U0xFoNH/jDq4tX2KNC5WqrzgTfCcZ5n2etrHSiW1ouQMhQhnbqjve8Y -ztH246hPVbOdYsk0vqwyZ9onwjBjYIGTZQAkh2SdCNJTIaVgX22x1Jrst4FVNCDvX/a0gwDMAjXz -s/8jIHmXSeNr6mLChuRtlXqgvj9SLfD6FxvunesSkTl5z+O7t6gjnsLpz1f/MpC3pLPQxo/RoP77 -rkn9ChBmY/GhLro3HaPaoJEiPvGDeEejwnOyWIkNnBdwjhpvdBk8Ul6BkUA08AX4yLTcgR91dlj5 -c1S7WhJEMOBWWS/D3KGrDeDnMjGm7S8liU2ZGNwdeFcyVjgpLd7KbzQg9Jhk8I8bMWqnC1HZ1Ca0 -n/iDi8M/Fjh8fLJMFeMPr2Rgc8bcDb3juCbc+U54SaFgSCl8f8bJYBva4ys9w0+0G68Dpx1nsDbJ -jN5JRqfApnpk+PrkIYObJSy9jsXNVSBmiSNAyMN3uA9MhBhTz3FSrpYB/0wKeaCgG0TncfSPjL7b -Hj3PSSp/0G6W2ryJgxH7DfdjenwDkmU4Mpwh8lG+JnR+8QhRYKkArSMPcZxJz3KSpj3un6HxpaPf -0ABP+JSMPBmWlLW6PVLVcZxbtfZCrEyIJ1xlz3Ha9jyax/pMAMkoncnZ/PNolrvR7HhOEj7DXXq8 -naNlYVK6vwWxcw7DKEvjccdzomPsjOZ02MzIi9mQNA4gLvYTVvMZuO69DOtgQ46ndYy5HctppoMj -L8aXZdZabfCpu7UfWgnN7zqer3eWGX4XF2WgoHzbcn0qBe1EvDGeZ+T+FHKtyZ+S0LrzxWzowlN7 -ps695znLbpjw5109y56viX4duftstD0l6/Vo+zQIbOdqqDRU7HMedG6SwM1+KO0vOsbrpnPxTY9d -mF9PV5RVzpg/bfpQ2jE0dZhkNh45twxc3695oojv/OKNsJzoaPY6W0faJY0KCOlwglt+HLTzfBUm -KXw38DOdlKNq6Uw+FPqlAKR0BZg8zCZoUKUZAs04aYlLi3ZSV9KqjWbldBOODGUD1D/hiUeBmoZ0 -6op/9O438LTLpI0uz8BsQN178vueHHGsfakd7TuTAXnH5Lv3v/FNZwkXoEk0NlEiMN/fswM+B6wb -4QeXrnBLyDjdwJBChtm3ES90lHwPEJ8xf1zxb8rWGywAqpJy4yeLTy+LqZ2NI88J3SNrgKAKpDRx -Vsk1MF7vYynZTEtTIWEK+DQors7aDdQZOGygmVBv6Bw5zkqqbEZITWUcVe5odIOPhAT6scvAsQ6X -tcoBpo7jJH3vdJulBjaaBB+Ec2fMhn6sJUTmb5+LKGC8Ch3PSXJbhN5oJOWuqM3Marl9A8/P4TM1 -Ljv6hh185DnLVGIqyFyImiE1WLv9Wo+sIuMyBtyIsgFXXMpfHjhObpB22luZ9kZ+5OSKTNynvfBM -JO4ugQmHGeE1jZD0J2T/DPjxToR1ZNDXZ3WqZfR8Sg7jhUOA7WaQ9wbRF2IpPKMpjzKB5nFkJAFS -ZjGNqPMXJRBDeRQebikoXY5kiIXFRtQQKRNjOX/RO7BGROVil6WUjO/NajPParXvg+jXK7P9pYFT -lFm2wy39tq1Er6B2IbZX4DsdzfCeRwffvH7uMEZcoNyg+qWY1ndFDiNBx3La/j2IuQ== - - - fiBmUPKHm2VUH5/f+cy/lppmk/2R5bS+ywJYR1e8NJ42WnvXPXLxva3cGMcJxoIxZGmzb2gPO3RG -el7CG2N5yt9cvlIfZXN6XIgNHk42Nr0fXR515DQt6FlOyxWY7Kdjbe+1bpeFv47+fTZXOynt9Vzt -aWjWLs4yYajYr4uzn4Mt74znE9Jet52LD2zsPPU68Ol9XlDl9CmYLGdsfv7IcpLRWGQuMq5xrbd+ -SHFu3IP2fvHGOE50NTuVrQPd9tlZE9MkX36tPF+FSQrfjbsOJGSr0CuXTuVDsV+Lct+vARWHWgWN -qzRHIAUjbTew7gmt72n+xxIrugkHdrIB3P+yGx4GahrSiRv+4RvUC7CW8AXDqg2ep8B/qAIZpDaM -nUdyArk09h+ZDMg7Jt+9QS0pSp7MBezsgAdJ+9b2bw3qZrCAXLOq1JAxljeDAfZjNDDuHZ6YviP7 -5c9ouMbpkP9kIj6doQRFMuPq6bUjy9cHGwBSJVxbQWGGk6AFjlBHvCghtAxVVOWr39yclEJ3zNyo -82e1DIq1QVztOE4K7gBmw5C5NqsPO3Rjj4TMoHked1y83R4f6Dh+XZDENRCZbbnxsyF25S/o+cKP -u2MQ6hRsJrajFxmdM+Mq4/uTas1tvMeBt4ZxH6khXwN7Ki31RpIxY1UMlEZtQFIPHBGxkoyYUG8R -ghi1ycRo7B1jG6/CgBhcuRJ5nPljmOw2z0q2xHDvlF2m97uM7ccvw83eb6qCQ228iiV9Sw1Yn+qT -aL7jOME7HAWsQjvtSiK63aen601m0nGc49KwCzGElp23ofadMhHgQgoxl42LSg0jc89xbpHbibAS -EX7B7sPHk5rlk4+2sT7jCwCimWy5n5jbsTfCcVapCDxKj4+YONRmUwuE+4AwdJfUsXYsZ2md2Mt5 -95fhEWFFxkqJ5Uq4v2Yw10G0jyKsfCPy1OncrCYaTlgAqS6rvOBk3sqWfmgkNE53PCd0GVA9JlMe -DXK6gs2eTyU6EW+M5xm5PwEsK6V1dCaf25OEwDS83G7hmTkzp95znGY1RPTzPp4lQddE/wQS9ckg -e0rWy0H2SZsnfoYKQ6V+oZ/5BPg6s/nr0l63nGvva+zi+3qyKKiSG4XSLvo3bcuJ4Y7hJJPxyLKj -u98hOl+GdR7xxnhO8zJHpa1cubTWhJQoa/Fj5Ssyfsdxksp3Az9XDnfapZP5utqeLgKTh9oFjak0 -QaD5JutpsA4NKyZZrcbycbYNR4ZSge5P+eFBkGbBnLrhH70BrvC2A476A3vElbNHwBaBDzDpTn7f -kXEu6IFceXDqnsV3737nywZixpcQtDWs67fu9xhBWzajQRzHdVRbDyEKUdJLYF6FtxQbmp5REXiz -OF+bGuJowc4JACKrn7s7hq+PNMBZypA94c2l8v4RSIvHOTsZ3rsGmIyPcJBY9BAbSWwp06rAR2aT -YrqFAw6pjKMLKtpxaC6gRx8mhEJaXMP823P7urAoCrYeEnpbvuY2gwGwZSYubrMEmZ7LluBs3PD1 -os1dJQk0vkJlg+hyx9ELH3VHtFtSKMRyHo2pgmusW3gtq7KYbKqhdGxBWpB9B/2mYvurZHGoA6SW -gnQTfoyIx52ysh0w2CpsS7Gt90XI2ccdJFPBu8TI3XDtxxbEA6bIXt0ds9c7gaNsVdygQqaFxfjx -Kh+ncGQ2xWdJGiyL7YADZyuO4ymbkM2erzlCmcaXqw1HdnOr106CtZfgCSPv2E3yuZ09rKd3vczO -Khi1/NQXoJKO2ySpJfHOGIYmiQNM1ld8272/HzhD5jQ7flMbTDJaxdOTP0y+Sd8Z8Fnn1/GbF587 -E78s4xfaOOAwdS720EsKFS9yv+ADw6Bh98jv9Z4QI6hciiZ8YNpemziXFhzluxGGZ2S+DpuNLxjA -g7VS7DvXEDo7I2UGQLx2x26WnRCxT7pwmtBck/syaPa56HlO0qvh8zkrJ36QSUJFfp0jvI6YTezl -uqyXDebScxm7yL2eTeuLjAmPwFjrUZEplglMMRWD7j9GXcqx4fO1U+f8bj3DeS5lr611oFZaHkLI -gJQGvy6nzjuGc3T9OOpTxetRr2QWX1aHM+UTYYgpsHBJoj5LG1nbgfRPWPVHKiyWUJPdNrCKApd9 -xsvywMviM/OxP3w3GnPNUNeA49/Qsm2qqmjU9x3VLztY7MZiQN7x+ObtaGukGFhIU/mX4bJxzUD9 -KHDZU8BC/FK9rihZfKBpWGZRA+8nLSjZ66Wl8KYXhSs04mOc36BEdf5WYoEc5ioE15Hn66MKMJDK -EaEAXPjaBwQx4nmLKPlXMKmJaBT+MuUvieZOTDET8weLG+M5KYxnrCYkcxgo1LdRusFHYoJYEFBB -VGaD7tux/LKwCGMxFl0RA1tQzYAC3hTPNKUroBw+laG4F7MINtzhwyQ8yZIBRcrqjWjwYQ6XdWql -AaLGMT3Qoh+rYqg0YgUOL1uYbL1JQvRGDCK6tW+mAocKKWoXCk2FDZ5wN++HINlvoJVti+EGoluN -bcqvaVT3+yobrMbjZngRT2K49fEDjRLd9zxnOImjiE3ufKpDiEk1SGS66N1Ueo6TXJtHzYcmmFGq -QTSesxN4Ap8RBESxLui7tnc859ayvRArE+KpDdDznOaejxaynncLmKTGFWv8OFbUm47hJMmB3he8 -RhRQ5UH1lYSGoeNkHrbjODEmdhZz3hFCzmxGJkjsWKz6hMVcRtHuZFgH2/Ez85plOkBuBH8sdG34 -9Ys/shIasI8cX+8qMUQ+zQbt5JecG0jpuZTiKOGNsTwj9icgtGNtF6CX50suSBedGjP16z3PqWb/ -RLyiGVAn7fV4dcVjEv0/EajOzWiC5TNfQ1XJRXyhr/kEjjaz/U+Ie133157b2MX59WydUKWMKqKD -D/hf72nmMMlqEPYxbj4u2oq1c3VZ5xtvjOfErbpX2jrQLq0+IabD84Eqbs+39ywn6Xw38HMFcqde -OpmvK/fpKjB5qGHQ8MoyBZp4si4H7drQ6pIWbzQ3Z1txZCul4D/njkcRm8Z26o5/9N64dhs6tikw -2BVLWx/I7zuyNTtyYzIg75l89+44Pvmgu3IBSxtXAX6Q5vjfdw3yT3s6Ja5Dx/xVy8CXVAA1jysV -mVjfv8hEQAkh7EfTgBwVnrLNFZ73G/yqVxlBJ4oTbE0EBcBRm4k6tGtG7s27Bdd1vAxj7yjMS3SF -GOtF0gxzgLGFGG2FDfO2OD18fFt0vR8Jorc+E22smBQArVi8KsTtTbnDxB8dHS4sZled8EZBKlpZ -ACTlU1aAM6V3nSUDMJB1wGurd8KBqxPzBbzwpmxwbbw9z090Nq9XYt0k1oFodBJ0uj3PCe1Cq4v1 -mShxKTVMaV3sFOmb8cZ8YCvMqjqes7JoIIJpwBRjIJXiJvxu9I+sv98nHc9JSt/pN8stmQoepkb+ -5oxXH+xFthIdzxlyH0VschubcjK6NPzogbfo59KxnKRugFhbY9/Eejbk33MOBhbhHA5bAPrOV/iY -jufcarcXYmVCPOU5e57T9unBRNZnAgpmma9UwkSSbnDMB5azRAe+oMUN0Jjv9TUQ3b2LGDkTHp6P -LOf212S0grAX8/XR1GbQm/Tp6NrznOjge6v/hJxfavXCf4nWlXVWzjT8yd3ij6yEpns9ywneEmME -POcmSlNxCRss6ol8tBfwxjiekfoToN14fCuIE5EKZXHlgBQ1WWoK1LP3POdu2tMRiyfPnbTXI9YV -u2f6Px2qTs5ohuEzT8lUSUV8paf8BG430f1nxL2u+2sPNOwD/Xq2xqxi+hR1FjOmwFOHSWZjUdTL -uMaVC7Zni/reNd4Yx4k7daeylauW9i2KlDgtih+rxBdhlr4fx32qs9Irl87lQ7lfi9vdrwEVh1oF -Da00S2BZJ611afVOq0tau7HEnG7DgalU5O5TrngYrWlcZ674h2+IL7rBbusCu7023JEK0q0f0Lg3 -srV6B9JdmQzIeybfvSGupKhYlv7U9wnsbi8bx/4o58Vf3xJXLqJdpcsFElNfMXKSfuR7HbhB4uwG -C1ce1xLi9koNApMtF0AW1fpjQjT5WY9Q0Prrr0OqBaLXcYP2rd8TUajXygSYqXikAsT83kAjKtya -UXijMFbsYy1OSuPKhH4zQfmNiA98IEbjU/u5wXPYIAZX42I39UdvJ/IanR+hEh9tKvaZ/ALPLCDt -ibE+oaJMeb7U4luvq+0EoAEuS7kpbFP5NN2zvP0KTfFuDutAMj4HOtsjy9cnGEkB7CyVaryEHpDy -08pCCsp+ZCbEoI4MJ2VzgAfLL0WjHsfTyms/9Njmye7oGM7R9U6xkFmMyucM1AIwQX+w/cgKdBwn -CH0UsAqNnCznn67eCOHugcyk4zhH03iEG0PodmvktD9JulgAisVFleZmx3FuaduJsBIRnnKSHcdZ -G/NoG+szoSPlR7fK9UgZJDV72XGcVSAapNyqnpyzDUx/7xWGwZWG4SPHuX00qUGyLeDVGVWgWZgp -n4+hHcdZNkOs/RNSfqG1Z4hI3A7GCkuiYBsO527Zh/ZBE7qO5YS2gkE5mqsZ/Jva3pU5mXN2It4Y -zzNyfwKn2wGWWOfS2y42NrjPo8EyU2DevGc4zWaI5OedO0uVr4l+Gab7dHQ9Jevl6PqkyffekcpC -hX6dd/wESDcz+MvCXjebSznBPqqvpyvHKno+IW7hV6vBHDlOMhhfWnthsRvM9blSvXOGN8JxmoM5 -KGwdaZa2IyBdPqAsv86YyGwNJul7N+5TDZOjbulMPpT6tfjcZAmYOMwmaCSlaQFLMFkhS4pyVjqy -yoxl32z3DSykQnOf8b2DuMziN3O9P3p3W7mlgmqrB2DulBoAt3oA1d6oTu0AuCsHTt1x+O6NbVxb -EN94BZbblZPvP0Zje9fUXloyp7Z8Ov//2C9Sl0sEQaAxR6fWbDQkcd7e/6SjefP1rEyEWzTxJ1zg -sPWkA67keKV/0hb3jDJF/In4Cy271dmCa9oxmxBRdHnyV2sJzPWKsZCsMpkk/xSbcJiwFm+WUgEv -yDTx0KCJ0yvR8sBuVvTWbxFPMePKQfL1NMxh6IGEonhjFpVp1tbDkEd2XxYDZYXTEoKssBUJjW3m -YpPPtAyMfSs0J1EclpBiBTNDdBLNaLynvATfaHBqoMkixvrbCJ8FmlUpjbRAtcXWXUSwEot0jjrV -eE2B+ALN69QM2kRZMNBaVdzN9yECdttkJTuAb5R+N7E990XoJsftkxN5PBMk6gmSodX7plSNRN0d -vwlO4CheFRkHsHRw4gqdG64ymUbHb47fwutFGGLxNot8yjCkpNLYnVBnXOrrTEdmZ+RdFoiGQCHS -6twHqNGhhIraohFHlv+jpO+HsVcy9lkL75jN8rVHQ1jPb3c8POl8/unWAjuymyS21HL5FS7Z+0XW -lfj5gSdkHrPj96SNVAm9xAspLJuN1AnUQJHlDmXt9SLD1CeYiMme83hHZtOK6d6urw== - - - CfiFdi0Lmi/OYkHFbnPo7RZ5YAwszHb8Xu/0MARe94O6cvdqPZ8FdOLdCL9ZqvYSIyRyaY/PsuXF -8JN+jyUAHbtJW/FkjDkl4tUo86SB9M6DScIkfpX7uBAWmXlcFfFp83hlNi/CZPhe7cOblJG5moKA -GjFHpEm+tJoyTf4ZtPyY7jvfi8ylsDjE6hdSibFMkqVqLEQfI/k7me1DLn/GEN/5lmD+nxji1WT+ -6fqeWSeRh4nNpnfJeV1L23YLtp4syG5kYUkmN8d37TbFer7s7TbPjW+yKcGNbHqmVVbWd86BaX+S -qh+HfaLr0KmVTWMs8ndrLAdVXjCRvY3XNFXDD0FO6O7U9x0VJgq8nfcdB07dcfjmHWXt8OSoudBR -liIhP2r6PRvKfmJDWbyZqCZJYHH4GBTLnRwpwGWzifngRkstwPOFDuORLkh+1GghAxtpb3DioCJs -HTlOaM8AXgFHYvSyvNUDbiDhGzBIQdWDBJDP4e9ULBAGjYgEDLiW24HUA8dZYRO3tqMpUm5fWA9j -D2WUFcjoWyBuX2I7jpPUvdNtu1CPT8AowfNDY1lE+W9xRWIRkg0Ercar0PGcI3ceL3cJQul/F5uV -VPTRaKlxI4XCmxh6Ufjs6ZvYe5azmnnd6CsbfbAJz83njOgXqhbJSMrb13Afi3J+8yl4OgReXMUG -uoa0VttM9K5Bl+m3EHX5y2z77/+uXsaKPhtWfmH7vVobQM5AzBfu3pkJNiJSatHREpJqLPeG8D7w -Xr0/fCcqbixzW0rVnOWd7eV3tpfrOAFH5XGD1uuYCtGWS1Ig5vcz35mKZ+ye4wZvux6nQSTXeLjO -eFyHoSvoeE5ztEc516GcR8uqcub31fFzGcZuwu94ThI+AzSkYH4C3J+ydgtwe0c/Cgm9Gd0Yz0lt -rXzR24i9AjuwdfS5LyVOiqYePctpVsOc7nUxL3vdi0YDIta3vc/bL/rQPDovcyMsX+9k8hBSkOYx -nKm4dZ13Oy3hjbE8Z+lP5tEQQ0pVX/qFi93uhXeWSk2AJhI9z1nGwoT/ILs4pEt9lLxdFf5K43yc -1v1SKULFvJzWPWvqxDFSabjcr/OMF9JRbu2fkPOywVxMBvbRfB3E/T73rMJrB9sCxm291dixnGQw -Ctmx6OcO03vMo28jh9n5wRvjOS0cHZS2jrS7rwHsXcwFyY78uiU7HctJKt+Nu44kpOvQaZfO5UO5 -Xwp/zRaBiUPNggZSlhPQ3JI2JkibhTYCaJ1A82+6EQeWcseE/WU3PArRNJhTN/yjn4aWRSuPlEid -+3AcWgUJwAa1diO/78nukXxnMiDvmHz3BraOV49EAzTL6O8Kfx0+6mC/6G1IlT+AyN8gnqdQjxlG -XSAb8T076Ip3ZfA6bf6eJ/8Rw3Z7xSt8VAsZYr+2M488J7RZlMRurUs5ZkxM7eqtUroUO7EhYEFE -i78UuXWsSHUguvxlGP0Ws90v3vOclVnJQC47Q7yeUM6j94MPxZSFWBKOXAgx4DPVjbD8smiJ1c7v -GmiPl1HqM3CwoLwS3hX0qVsl5ikieG1gduZtsfi0qvBoUy3/QXQothXwsBbffu6hQhCDinGsDK42 -agcinkJ5LI7W1tOHmbjA/IWYtI/t51Lk2kyMNvpm6fu5P4TMfhetbG/cd5He7yK639jO/KIj1N3m -qpchpSTIpUwK7awg1SnTfsdyhqM4SNikDqFkoda225p01dlcjiznuLcFa44xjK+b6ryZyM9TcipX -NmqxrhH3PE/Jff3ebyfEyoQYRpFzE5vmoo8msj7lGOTn0En+ufF2w7Ha85xWucsqRZdyti1Vrm2a -30WIofekfrZjOTE29lZz2hfiim0xJTwbY7z5hNVcxjPpZFhHW/IT85poO05MOS+0clX4bvWHdkIj -d8dzgsfEGAofzha8L1VeKHwiuehEvDGeZ+T+FBBbENPIRblN9eIfW3hq0NS/9zxn2Q0V/gNvr3+h -ZrhdFv7yvv0g6P5ShUOl/TWCLl0GKu5593ltGZ7bvtRnUo1+YjITk4V9tF9PFwxVTgUwFG2jlH4h -8QxijtJd0qULeAfwPV2lde7xxnhOczhHra0j/dJiFHLmVmkszxrShZik88dxn6uWO+2yqXxd7U/X -gIhDrYKGV5or0OyTtTxoC4eWmayIowk63YgjS9mQYk/4smHIpsGd+bIfvVeO7rdX+QyJfitnM4So -ddVEIb7vif6BuP2cEh9+/t075CgjrLrwPKQS81UAv/meHfIPQUNe1SHXuOeF42/Bvhld7pIoA6+I -uzca0P5LuZmBgJ8/Efo3KarLRVV8uXPieuDNU0WX6zi+PswAmyx/fEWNE1OuovNzz5APMbzCf0I+ -l79gehxn8I0GbCbQZLvk0NjxmxTVPbyyrrWZKiDb3dgDGSN6dSpl2pJszgE7fl8XG8VENJ5/zjf2 -QsVDgd3kG2m4s5XqK2kg2iWU+366tf4lJuL9kfL5q6GzIb2BOeFSYarP+OG2Sv7qh1uFviB0Ml0M -dNavP6wS9bHYbFTlaH2sj53j1pEO9dKXldmHch10O6DezfoxMHa7ZmW7YbBt2Pai+/Br+uHdboKl -4s2KULJPo0uTm2qTaL3jN8EpHMWrIsdYsswMvTVe7G4aHb85fgzvCuXjRqpAdp41Do9Ib8qtXOtK -Vt3xm1uOdyKsRIQn7L3jN8sNH61iPe8CPBLUUIuZeqWo4zerKFzqQRzkznAqKwkBA/dI/WjHcG4H -SkYrdqCUjOZSlb8z49O+sOc4L3B3lv4JKb/Q1tWSMhRjXuGl6Lxb9qF90Ih85DihjYAhjA95jBQq -EPb5nOEo4Y2xnKbwgHBRKuoomdQzXpGmCz3Hqdv0bFA6KevlsPSkxRDfQoXhYr/Qu1zvbjPL+Yy4 -z9vOS0uEJRRgXe2CVDb1cAKEXBCvQKwlSyYq1A0u3M+Ksg3LfA8LYqwwYkUeS0tZ3scifJcJvLM5 -PxYI52z0nW8YFjCohX79E0vUbplobA5srhc93oW4flzD9Wzhd2OLzfLDSb5ut11a7X2uzO421m2w -BWeFx94rUPXSbkLnP+hCTFL6buDnGh6dfulkxnJ/tyY3etY1n1RvMZn66mPIXzgeqO87anik3lkM -yDse373LjUsNsk2e73In3JtR3/UY+FRkbHF6+PhljC3XTgpOksQyZLISguqzFQaXvSwg9kJBMbxl -vNH8MIOxQK7S2Ul2/Ca4GfVmMkiPyLnY9ibHm0hhMi3zquLh4TYtq5/q2QHQ4pIyTZL/ejjswG+W -W5etuADoTXSUvG0QxPuxBzICJMyI8wJN/qyeVj/w+7K0FQMueNgADwrL8M1ogGwHmrXlTmOm4TVi -PPobN8AtnTHL8lvGSwPz1PgkDJqpNYj8NlqnM81qE0daoNpiK6+B8GbEWE2581dpYm4gecml6k9N -9IUmya6uNr2f7kPC2u2VleyBtlcy3/teYXuK7b2vOt592EI5Q8UbPTIT7e4zYYokCu/4zUg4DuJV -kRc4JY3eU+nRsHUms+jYzfFdaKFiiNxBWs+bhtK48Fd8hVi8b0re8Tsj8hVYnePYKxl7EBJOzWVa -Kn2whvX0rlfAjfMp/3TxNVQc2U0SG2iDCpf+AqAsU4N+37v7gUNkjrPj96SZnIbJBlyQy8losjX/ -J1Z71vEd2c0yEmLcV0X8Qtt2wEfCKaGAxSja7hZ6YBAs4nb8Xu/+MIRzpVqRPaQrxOWphKAT70b4 -nbPrZ7FmnaythH2DN+dTeR+bmCZbd+afO3aTNuMw1vxSyn4jMl6NNVfsmqh7GGsOcfPUXCbYde/3 -mAaZdK/ye1cQvomir4p4Wc+XYvo+MK8n0/YitgkSMI0C/nbNRY785tiHQXGkQobCWs/XRp2Lu/Xs -Zm3Eo7JWrlRW+kFELdkKRJRsxVLlz1H0btgnKtOjVtksvqzEZrpn0hBTYEGRxXaWFLKeAuuPsOKO -lU8sYWb7bWAaBbX+hHMdhFoWkolz/dGPUWPRC9i1foDLzs8XZGBs/QB23ajG6Edg7MqBU/ccvnmX -2Sx4BdT7C3DZeGdU/QaXzeCyZXPC7YireovRbDBoOn9F9GqrxAEv5g3uBnp4loo8jfY9hBTHpivu -4pHhhF4NcJNw1UQ7hdOaG46rhiMVWlCbdPmZA5FYpXrTG0S8B6t9BMRRvU16YDgrQfLI3WwRUrVn -zo+DD6UEwJvCtyMhehd0E33P8ssiIZY6RDRs8AkTn8ub7QAQC0TvfIXQgxvS5S9VUhtOmvIZiFGJ -GVf8S9Pu+fhlqx0yzFq+g4XcWcWxMrjaqBm48i6DBFoJcO36sRBVMpkYbX2TTX4uv3SZmLGQb2zq -D2Gx3z4r2xd8/7BtRvfjF/WeD9sq26t500m0hA5MTA0BhuqTaf7AcYZ7OAq4SS2kKKGgPq3Hl5tN -pOM4yaktuDybKo7jetpAMrDbgmM/Tr8tKvhN0TuGk6rVfvSVjX7e3nuG0/zx3ijWZ3wAfpxfRcfP -dajnCg8cJwme7x+mCCQ/U25XrywUjPwkc6g9y2lKZ+Zy1u3homjIZ5Ss3T4jXTOYK1jg3ejraPdd -n9BEm/H5orgscGs79qs+Mg8amDuWr/eLeQyTioT5neX1qdyhE/HGeM7S+RIlCcd3oJjeTGr2cs41 -0pSh53jO1J8GAyeCU1Ole4/GnquiX8DTPhdKTyr4cix90tCZb6HScLlf51wuwWkze/mEnJdN/WIa -sI/k6+m8vwqvHUJsWrYCrmM5yWAUsIdFP2EJW/l1rtLqfOCNsJzmFw8qW0e6peUkpMyH5uXX7cRt -x3KSwnfjPlfwHpVLp/J15TtbAyYOMwoaQWk6QPNK2rVgXRhSLdJijOTddAsOrKTU7ecc8Ci80UBI -HfCP3tXW2jQMbLsD0tYNMdvugLQr2Sx2h5hdmQzIeybfvLWNzyDW2QutbQXjhj6+Z2/7CKT998f+ -9gtAkMFE8kWj8FiW38ColLImEzPa/q0StXGZqGO9WxJlM1t4mwDInzvesYjlc3Hnrb4DiClcTfGP -0Nz5FjMQ9SSo2Q251rv8jQ6PqtWEAURrfP7Ap2MDRsa1InxO02Ls9WNtJi7RZaKE1A0iVzmkWkIU -5dQJHaf+4O3ybG0sXxmD1hUDecEjEDonPSkYv4kGQCajcbBDbdiq2e9DXpeWuwZ3PD/RqHy6ZumF -XwciceHpNDueEzp/wLaCOXi8KbzEDQdZmVKDhxTjBzbCrOnIclbmLOPIz1IeSPsH5OnHwcc2TzZH -x3GSwnfKzVJrPHuSa5WKOcd3H1uDjuEMoXfyNYlDLEmmbZD61Dmwiez5zdHyEmPKIxgXNpzmk75E -fp5SvlupygMlN8ZzUj3bj76y0Z/zjh3PabvyYBjrU1FDfu01Tq7gIitew7oRlrNEd0lU7FNOou8A -zUefMHIeNAR3LGe1nVwsloCnX7SJm+y9GZ8Onj3PiZ68N/hPyPmlBg8MS403k2SJRQ== - - - FN3ALvfrPrQQms51PCe4SIyhkstjZOjD9amMsxPxxnjOMvfz/p1mlTj5li8VSwVjYzLX/fslizmO -/px/PzejGRbDfAxVJRXxdT7mSlClSv+EnM8r/bUQu7GCKCUg2mrXwGQdWq144MpVOFzQ8lsOImNI -pQ6j+5Q6HRrAaJ7M0n6am/bJHwvwfSbwzmb9WFSeM8/3wU6nAYOa59cVldRmmUhceDrNa47iWiK4 -X8D1dKvgxpaapodzvNx+w7RK/lx7pttat8EmnPXcQu8WqH5pF+roQOhCTNL547jPtck67bKpjKX+ -bp1uNK0rgLV5wL9WDeraPOBfV6JRD8T2c0p8/Pl3b2zHiKlcQL8OYnmxf1nye7a156Bfx7cI/4t7 -FeIUGuBayG9Vi79ZQulORQfIJFwzDW+pPqkW8VkNt2wkfi11Cx/5vd7HAIksP5aLIiaVd85By6/l -woG7ch0P0rn8wTGUZlulIU0DLZ/yuRF+k1y6R7YE94txlNkAhXdjD2SMFRkMtCWFhim45zdH1Tu1 -QuScABZvbqptmAITB0OQsGRH2u/YTZHY48ZQPm+hyiGMbKZoWj3YKTNnUajPbxiLeNY1XNs9u1MS -X4cTPkiwEgn4vjsznzOyX6hngPbl8zPr+ftj2lwI3gHPt8VMffgCROAP5qthqT5fLUSN18/zHbLg -s5hiUAEfxHF/L8ODFZpRUsxlWixgiJ3hVRq+AxstRVBJcjoDeOeOqnd870SzlSEO84DWyqZu276T -bfte1KUz0jYu3IWqGugw5Hcoo+T/VZyjYidsl8Nmrvs75qPrvqBA3ojuB5v+yG6WJz2KuA5F3JtR -2dEaOWj+rSo3XDt+s5J6HO4BdiyKu/wc4Erc+MDd93ZzYxxPiX4dvzqgdxDLiysxtgkc3SbzRjSr -6BnOC75Hz/oJIS8614uA55LGlvVd6kfGbtGH5tG5lRthOaEMxBAmlDFScL5BRe7c2WkBb4zjNIV7 -gAyXzkS0IXwYhA9ZRRdUbozh1C06TIB+IU+nkl7OgJ60FuJVqDBU6hf6lU8AVxOr+YS0z9vNa3Gr -fTnebmTX+VQfR4aQi2ggE2u9kYkKKV3ZsxscdbdXmdeh0YuVNaxEY8UEyT9YbO9ygHc25/dH3OpT -FvrOtwsJFdQ+fwXYama1TDQyBTbTi77u0vsl+xVcebbXVxc3ttQsL5zk53abhVZKLSweQ2W3q26D -/TcrLPYugWq3q/JuzHnQdZik893A60hEuhCdfulkxnJ/u5a0bo+g4DnkO2j10uCp9SNodaUarXfo -1JXFgLzn8d1b0/n6gDMXQKsdbPC7HrmeDFq9eHwawi1q5zdgKtwaMXYpkehW4DERY4wFqpkt2JNG -/AIArJJEA1z5uBF+M9wMQEdRDMiWUPWLtdDEO2aaj2YTz+Hv8C6nb+Ck1st/Grycu9QzOUd2s7y6 -kvwgFBGVqVh8x7EHMgotwVsKqT38fuT2ZQkrYO2SGIDB9UxcqakWY4BXJTSvi8ygIX0BDVhWtwKf -GTL0UQJUWEMCzaDToDlVrtYiEJtKSuV+Vq+BgZ66JZfEyuCXCRacGu6yy0Wa0KLkb5WWgi5/F3Ro -xryf6kOa2m2SlRj/YJOwzcQ23Rchhhz3TjFMma+E4uDfoi+ooVSTvcI7dlM8wF46kTihpQHbCnjM -pZoIX+duFh2/OU5LAZVNhsiHp9bzpgEkudJuXR4eHTvwOyPypWPVh7FXMvYTZt7xm+RtO3NYz297 -IO1Z/F0I5U7ojfCbJLfzb2lBpafzM/amIbbufD31h8RpdszmhbbOSM76uPw6PAxHm/La/FUjuYax -vR975Zvt8lxmGUko6HhY18XYhqK8X2tuEizcduxe7/4wBE7iYgibCgr72WygE+9G+E2ykLNum0V+ -56AFsRAf30wwl732Ndzn3dBPOO0zM5lgH2QnEv0x4V62Ea/BPh/1fFnEZ/X8UohcVyBqjU9Sh5Q7 -PBAw480CCs6Ug82gYccCmSqqBofb7UTmUFgsYkUMK8dYSslyNhaku2D+Tqb7kNefscR3vpNZ2GKW -+GVHoYl5MnmY3Gx+l9zAtYdGdiu2nqzObmRlWTo3x3097ov1dPnbbZ8b3WWzHgc4bnqmU1bcd86B -6X6OnnfDnu89HJXKJjEW+Lu1lvHpCDjk+AxtdYGtzYDUFjjdG/V9R42P1I0Dp+44fPO+snF4zWW5 -cOjZ2vz+0fdsK89FqV7qo2AO+ZBNDS8qunwPQW8FeIa7xKPIRi/lbfVM9ADUF5/txamYUnH1PCe0 -abx5i3qRMRbxx7reZgYRsXDBxxS1of9JOmey2CY80PBFVrZUUvVqS8dxVtgExJEkenkgg9dcVjb6 -UE54/JRiJmb8pBvj+WUpaYaiCyHl1U5L3BDHCtari+Wxhlsl4vlmEMVg7oCpuMECW1OpIo6BiCOk -Mj1JI7xvxJwsmvxiQ322nWpjpLfeEJwEG9Ga9zgKsOFX28XJ3/nwtih7B2F2Pv9hMqUA6yf+kJ32 -W2hlG+O+hexuC9HNRrflV4FVH3ZWNln57whF2fQwG6ZRovkjwxku4ihfE1pEAM2Z5eMV7ybScZzj -2EL0qvSwXG3knraRDP+WMmae2bZTz3NSmd2PvrLRR4Hj5Iym+eWDaaxPOANMMj88g1/LJMNmL48c -J0meofASnjXBtxJdRe9CwshdUsfa85zUucNAUuQCTNBtXwC4GZ92ij3PibG8N/hPyPmVBg/8yHL4 -RJZYCu47TuVu3YcWQoN0x/P1LjKPkZ84Shl5p2GFnkwjOglvhOU5Y78A/Vyei7IyKYS/dWCr1Aao -G+95TnMyRPiPfLv9haLgdlX4S7jV46j6S8ULlfNyVH0eF7dzjlQaLvfrnONF5Ore3D8h52WLuYhc -vQ/oK4/8fRlQxYwWF8Gs2h6g7VnOMZgM4Qv95C90rRo7V3gd/eCNsZzoYfZKW0fqpeVlljP/WPby -YBlmafw+7HPVb6dbMpGvK+XpAvTSUItgIZRmAzSzpA0M2pJhlSMtzFj2TbfgyEo26OoTHngUnmkg -px74fwToaqPxBWVxb2KerdUdWmrZyO97snsk35kMyDsm373dja+oOl7B+MABbCU+7Hs2vL8Gulq7 -WOr6VM+5gJi/pWViA/LMRHxJEaJ17g5IbeBvcH4/VCghEK11ueyLKmxEjUOvmVg+G2bcu4hjBjpi -nNSIGe/K6Pv/1hhXw1NtELTiR+SHAbcx4oZkLZ60fGBXyx2WFnBmoMno20z2c35wc3maeCEAM4qp -ZDv4DopvuPhBe8Eoy7Xgy6PIsKiqDyNDq/x1NJVHd2+E5Se6lddvc3VzWLlkfAp0sh3LCV1AyckC -vv5L4epUvSoMeLCUSjWbP7IPzeRgSkdms1Jm4OG5OpA1VdfHwQe23m+IjtscNe9VmiVWbyGYknEq -Z+IHW48ov2M5Q+yjhE1sb0t+6fWiPnIO/VQ6lqfEvn43GOhcOCmE56rjsqFue+ANGxdw9ts86W+O -LCfZy07C9VMS3hjLabvzaB/rM8EDIi/IeIE8Z+82s+M4S3TwD/lOpJG8uz472vmHoSdhMbhjeUr2 -yxghMlyxETy5ovQ2g84czkbSnuNEr97t1OtSXt6o17CrFa7XY42NueOL7tZ9ZCA0mztynOBiMETG -AJVqckPnPJlsHsW7dfzOCHw92RIXphN6NVJde29U03hnqMwEqCfsWU4zFib7+YhEc+Vrwl92Muej -0zlpr4enp/FRe+dIpaFyv847Xk9nqPVcl/a68VyDMt6F9vamxS8XkFXMkCF/HNg7RbOFOUYjApVO -XgpK3yv4U8X63i3eGMOJnmavsXWkW9qQgJy5onLLPe/peE7S+G7g53omnX7pZD6U+7UY82wZmDzU -Mvq4ypIDmmbSypYV6bSWpJUaTcXZLhwZyoYxf8IRD2M1C+rMEf/orW40rwsWCp5EVgVZr4J9LPh8 -2Mjve7LfkTcmA/KOybdvdeMhVDHLC3DWuABB3nf8Hq3uI2TI/9/d1bVYbhzRd8P+h/uykDx4Iqm/ -pOTJJg5sGJOQ2GAIYZmww8bhajbsLrHz71Onu6W5Uh3N9pVv3zBLTLBrrkrV1dX10eo+VWGrG4Br -Idh02crlul/qNhPbVOCuTcj9B0CM6KW4qjUd+8b1Lhcvp+KT/7QbFjtj5AthjxBHffwGgz9aHxMB -gOyhMYY8h9fEQNubmx7tGkATefxEi1/ghDaDJXcSUOA6hcmQW6+A1sL4cS7P2elZ49I9PnOCiLcY -8qmTwyiRDRhZdrafMOlsvIYiAxeJ+kmkDkOU1+coCwRSvNzA0fsZuu6U2/GaDTSU2CMViIidBhdO -B6e5XT6F8G02sC6eGOkyjGSyRHGDj9DZ2hqI1Sh2lTI2oOrFfuUdkv7U9F69e8uyyQpQ/Opo+lSr -CcPYDCZVI65JB2/oGiPaX7OrIPBauixxb/qUW4Z0uIx6ADIKxa+KjrsBntH71C17LPUaHjEcjZnQ -wcK0E6r6kluJwDtOZal3j+Td3EWUjKTWElybwlgaDOTJ2BUVT/ZDqq0Vt1qlHkDxhpQRB99OsLnL -xb/hJGg8VQzPNJJyOAWf7bg16QjtyK22LCRqdrXMhBj3XhGvaN2Y1ojlinn1vW1nzNHTud40CpaN -KY4VNgTwDqDNQmWStNgJ0LosX1QSHhnLMgM/N3Nq3A2Ojhn0f+tyHylmo8wAmKNWDKsZihZ823l3 -T+d3x51y7/An26HyEzkok3FvsDzXuokLZLJwoS/lBPfcwmLWvVvIvVayL8gvQ/VYVt1luRP0k8jY -e8dDfx0ria0f8d759lJ5Ia383ZHxrOZN1kobt9RL9wsgZ4QRl8clldmYiEpKX7z4vC0NpV86mCfl -vjSyvJ4GJg+1DBozafxn2SOrRVldTSpAVmKxzJotwy0zycjyJa53IxSzkE1d72e/C43Zi7liZ28a -n/qrvnztkUF2J9TbBTWcUh9ZbJAXPJ77HnS8OzDsQ602aNv5PLeg65+2Focsr+kP1oS0Vz9GWoQP -A813LuEuoeeQT79r/Qxq1AcczRmam6FPeQtoPcxPaE6iWaZZWfKR5nO3WoBRxZ/hm9hEsT4kUmjc -TEMvVTMM6dsfaC1iTneQlEncVDruBlonHhW0vhl8psXG2qBl5Lv1WE/8GsYXIqStuKamnfTQeAs9 -ePRFGSaJjLhsawGilb4FGwP8KROltCHdL1f8jlfcfVaCj1wgJjgboOJ3+bxhEJPr8dES5726dGRA -aDEk4pBAnxCoqEEQw1HsqqVpstj6JGNrE9Kdeve2ca+WgOJWRc8LnUZ5mwgwaLvwaOZskRHdr9nV -EHglHQqPm2Gw4uCs5MOmc0+5ADUKxa9apYercC6qJjrHZBmNsMGrO+vac/yJYlfFNBbSjb9AuqNm -V2kFKlsYS8MBINukdo1Pzh9F19wqSQ2cvwZX6ILBzmfOolern/oIFkwVt0pbRfIeaw== - - - 2yGmnPLUBGSupr40ICp+9by0Wou7Zdy9GHcBmRuHuZZ5bUyYcFSXc71hEywRU/wu70TwChuLFSOF -Zze1dCjKE5V4R8KvgsjEqp2VX8l0CH2CxWLZ4MWMesdiLHTXTGwyuit56/Wby4NiyTjKNH0uALAW -mU0x8wlEqftEPh9UWwu92353KnpXw4lVRB6Lyrgk4OCE1AHooAk0vNfxHC0KZVFLBJMaywtl5diO -hF+9VbjQ1siVyvYBICKQPvBsaxO+zZpdHUUv3nrGLoVSKhvFkyJfFCVeq54JwyyBhUIW0Vk2yCpL -ViOTeo4VTCxNZuuNW0bCiC+IutyFMk/LPPLnvonshwld2p7iU/cTErU9xafOVAmrJ9SJA6cuOTzz -HWTbDMCP2bGDbA3WyTPdQK6KT93J4rSIGQ1255sZQ6zHR2FAAeXSG2BuXfwKFsSthCEj0bkb0/pB -FruH00m4hYrl5WNJxB7qUPk54K/nJoIg4suU0Pp+AuR0ua9AAM7VhF/s0vlRE9DdwWTE3DXLWoWs -aLUL8H3OJBjlkb19U05gpDVNH4m9SV+0FcurxULYisGfMNvxuOBkQACWArE3Jsb1RBzSL41/RBoL -LmIZSqDrw0yLl21EKVPpEHHKWvR9haaaod3UxZbSiBnY2ApBgjQuhXYzrfEiuXjbpp1grC1g6Wz8 -5WD6aTTLcZ/ERbWARrYsthYQXWpsTV4Lm3q1rKK5tvh3SSgaXOLMN/yoPpni1xxrOIi1gJPUIUSa -y2fhNydcjURxrOPWQo8brdjQsm7GSC6zEbgBP1g4EcmghnziSPGsVK7qt4/s7WdZveZZzSmvTGM8 -wxdgkAYXkfG0jNHP9nLKsZLkwMoLPY5/4ANJZ+d2B8uAsOEtqVvVLCttf+FFsfQw1s8b/9yKS32i -ZlkxjGtz3y/mNa09AkzGJuoywdPGo571TfugAVrxvLx/jO/oIgSkS72Ox3NSCCXhkbGssgEphfNN -DINDe+NCOoJGTZXaAPXhimU1Y9Gil7t1mvbsEn0XLHVpPC0Tc3c4PdfMiVtkwnCpL+YVd2FSEzvf -L+VeW9nZnmIZxMfSzD9L2VvE1gFQun3geUElW2mA4TsgP51AnUtLLeX9joxlRc+yVNq4pV5aUIqc -HU7wDt3cwVyzrKPyxXvPq3iVdtlQrle/0zkg4lCroNGTZgI0p6T7FnQjhpWMtCJjaTddh1uWklGp -SzzwVmSmMZy64M99e7vruglP2i9AqdsJfdovQKkzWaouIDPP6NOZyQZ5yeSZ73HHrzYAfNkBSo1D -+M1z3eVeH5NeHpHeC5m3XFYtPuLi5gUq+tY1doIRCwZxMQDxPt8RMg7dmfFhDc4z1/5A88TBT9v5 -myZ3Zdc8K+wLAX6ojcVMbAY/wdE2QOL0aAnsHgU0QPnv4egmOGwQ0U2gj62iM/rvkmOtpAq9L1yb -ysf48WrU796UUYixRa0J+KRpZzzXJcerhUoYSueGtB80DGYG8Q64DxOJbfqEHYmAewUxnreN5RHy -Z/RGAMRQ8MNMtMiDQ5sSiEyUf/WJOIQntLGlN2IFEmHRWQq26/NHfxClOLbx06zY40wMaGsdiWLv -04iWYz+JlnoFjWxdbK6gtNbMcq2xVXmlDW+1tKLRimxS5cdcrnX56xJXKlO/4lnDS6xFnOT2LuWg -vp3ui2/Mux6M4lnHu8XzEZKN4ezAjJBYaCniERKynwyqzzdqFcsisX8B3PZKhpHJ8IkF0D89rGou -em0g41mOoQW6Gk65NGgD4x+tZsGzlvAuiI5xH9Lhi42dUWWXIWLTfVJHq3hWDI7KaIp9YcQNjLB2 -LnVS3W0z+0G3lxLM/QjUaqT2XTKoekAPAHfEf2CSpVwfJijG5cxv2ggN24pnBV+JdzTexneEwUwY -oYWJhZLwSFhWU7mHYzWxCvfen+kjaTqxZllD4atlNpLXbspXtHDrLtLy4Fqk4f9HcGWGs1vd7nzD -uSwsrscRaNu0NzKBZnI7bWiHSBRGM5Bsi04LkHAIGWCALFXqdWgMo6UTKQRprkoTQRrndUZwq4d9 -Wj2UrLDbDbNjEY8tsOs3RmJGy6IbHQEd6i5nt6+RyXL+xuKi8KhnmuaIdfz0cr1MxXlZHb5eWceN -JVgrMq59AlUt3WtQ3oNMQiV9L1573maI0i0dyrbcz21DHHvbGW7aLTCrmwmc2i0wqzNZvISQ/QxO -nZlskJdMnvtO+CDKbcMeyGqX7uc/z43wNWR1lY1w8eIWXaLhzl3TzBhmJnaJ7sUxJkRSeH1hiblo -235CiO073CWRqs74/KVb8bu8xwH0UWxWi4LGp0O1oKFXbcgf+LJ48bNeP6QrJhNNngAN+eGRcKvk -2z3SpiaVYWFIilbv5iL22IMZ0ki6kACFFbvrJa64OoRG0fG+kDUzsrdBJ+Z4Ycjn3Z94oaj36bZR -k6uLDgENfVnwgavLDZVA9BGjsL1p/TBMj/fx42D/CLFNVME0xua+RSSK1joMqakjSA2yK+NTI+H0 -qIG/FVI8fXBkIz7NWleLZWSLYGO1sFVFFt91drvXSwhXuESh6PaMgO2a3mypkWh7ze3ybkAJlwUO -PmUdPt0OpHOsx6C4VfFbsQUgjhD1OE81llsFANga3O0VfU6Yhopf3epbiTASEc4wdMWvkuNd28RY -vO6BmIce5ng0ni85am61KoEGNV6XjsXNuNBrn7/hEJnj1AxrxTliJoV+DsiDCakWnVi88/vNZPcu -mRJh5Itv95AqGkwwEaLR3PjezVDLy0nfsg4afxXLCtUj3tHZ1JOntWZGGC1MEZSIR8azRO79GzyN -lWiCe87ySJt3Sdi0M0tmPlwxrGYyeI93C8lLPTrNcTTHqou1NKA+IeuJlndH1DMNnjgYrbdNqS/m -YvbvwjN73y0rm4l6icAynI+F2X4W3FiUMgAscOmLgmJYx1wiEDHea7r81aa8rlKu8Mh4VnMwa6WN -W+ql5WOUMz4c+jbwaail8sfXnlfdKt2SgVyvVKcToKWhFkHDKM0JaG7JNijYXgspFFktRvJutvy2 -DCTDXRf53o2wzMI39b2f+1nutp16o6DT8SPedT8hW7tTvOtMtd0pdWaxQV7yeOb71/OthPPxri3c -znM9yJ33r2+/lj999cq9/ubhze3df+/ff/llJnx9//bHh0jCg+l/ML9oz+JaRGXyT3NwIN7+48UX -v4o/PnS/Ptxu28QP395+/+r3h98e0q9fy69/F5dS81p+Ln9aL5+v8H8//PTii99gvX13//NHcJJJ -+cP7+/vvH968w+/jf96N968e3tz/nAl//fgOE54Jwu+TS23pDv4o//Yvof10sIdvD3/7e3N480L+ -9heyCLkSX/757u39d+/vfjxChW8/3P3n/nD38PDu493H+3/Lnw5v399/ECHvDx/++e4nUPDQ/MDL -l9/8SZzV/wBtC+WQ - - - diff --git a/branding/icons/numpylogoicon.svg b/branding/icons/numpylogoicon.svg deleted file mode 100644 index 840a189a6845..000000000000 --- a/branding/icons/numpylogoicon.svg +++ /dev/null @@ -1,6967 +0,0 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - eJzsveuOJMeVJvi/gHqH2B8NiNhRjLv5XVg04B7hodWi1U2I6p5eNAZESSxJNVMXbrHYPZqn33O3 -Y+bmEZkZKTZFVRgzmRUZ6e52O3Yu3/nO3/0fX3718/mbD797/fPmWB1evvi7vzt9fP3q04ePvzjQ -24dfvX37/XefPuJbP/vNF4c6HCv81Pyr8Wv55L+8/vjdmw/vf0G/O9b42wv+/c9++/HVv7/57vAv -r77/458+fXH42fr+058+4M//5fCr978/foGf/O2bT29fw2fff//u2z+//fDHD29+/+H98dWbL+xR -4NLnV5/gM91/Df1/DVU1HoZfdN3hy1/jR5YP37//5s37Py4f/tcvDmHoDqHqD13fHrq6xd//329+ -8/q7/EPHvu4DfvJY9W0HH2+Odd028DfNMdQt/eH5w++/f/f6/acvP374/evvvjt9ePvh43e/OJz+ -/Or94dev/gi/eXX4f1+/ffvhP+DT86+6ry9v3r6Gfr979ekw0hjNv6rD18v3b95+84/fv/vdaxiR -UHX0fvM1Xe6fv4PrwCXxZ3p/+PpX7+Ctr15/+gRPC3ejof7NL5cTTMGHd/RBeJPaz/7tN6//+IZm -Bkbov38hn/SPSx899mFouxp+GIa+HerDz3759sPvXr09/Pr1N28+vf748dX719Cl5e33r+ka/ydd -PX7sy+8/vk5/W+Pd/W9/+fH16/fy65ofzv/6N6+/ib88ttNYNZP7zFf/3/evvvuTfcJfncf3Cxmz -375+9+1bWAk0i21VHWGypwm+u5/1ozAX9LG6P/SHYYTlMLXyuzixr//9zev/+MXhHz+8fy1zOH/8 -9NWb/w1zMlbVoa8qefs33799/fGf37/5BFMS6L2JZ/DXH755/RbuEv/88vYVTZyMon2XT/z21cc/ -vv4ES/LD2+8/0aYZ7S6wSv7h1Z9f4yqr5Sb/9O3r97/98C/0mD+v+waeCUbo2PSHumvHwwg/hJ5u -0h7qWm/Hg6gPhdfAK+i1BxzpL2GZ/dPHN3988/4X+nDD17/8+OabuPaGcBj5G133OLqvSb/kOaHX -nz69fq8PDuv+9Gu3iqvjr7/Cu67vvzl9eIeD/x3tXVjA72HBwraX38Z/0O/gEt9/K92gN76Gufry -45v3eOGXL/6Rfzd+/eXb7+GXv/z44ftvf/X+Dx9evvgZy64vX336E6zd1++/+Q7ED7/H/zzwn8C7 -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 -Ecx8bDTYROxEWf/YOf1c1qgkKav3skSqVBUOIzvo96O4r9rViHazM12NPe+ahb6tn9412ZvO+/fH -9I3vd1Hr8Kcy6qbBKnrT6eKpOa5wA6I0lghQtVb4fVKpwfPO7Cd0s2ndpNWbVHtTIt7TNr5pK7nZ -VK6yvK7bDG0Sa1EXPrQSXREB4TigpjDbTbgtupqfTsniVCM2d+a3rQdXO8O7FolvqyZXJeaq7vz9 -hwSxD/Cy06Lwup2gde7vav/fVgjuqsN7SsZuILpZPmiVPhEkUm5BIuXXLx7PAvZC/0VBVLywwgD+ -w6PfD4WKnJhfN6Bg1wP6DbCg+HrDe1FWkp1BYt0cUSX2kEIsXyRPR5ZHy4r9knunpz+8swELMI7j -4LS3Pj58A6Yff71hXBSPDxx1zpjyl0EqcBvQaPE4SgVuIzpxrsP82FIqxn4Z5FiUx/Fcgf0yxn4O -Md12Ld12Ld62Ld727cT5hH0rt30rt33Lt33Lt307cX5+38pl38pt3/Jt3/Jl38pb+1Zv+1Zv+1Zu -+1Zu+3bifMK+9du+9du+tdu+tdu+nTg/v2/9sm/9tm/ttm/tsm/9rX3DE8gXNumufPLKKK+c8sS6 -dCj/km9suVxY8A2Wb2w5P58t5xtbLjcOfAXmG1u+DfNzbDne+HK6seArMN4Yc3yTM+cbZy43JnwF -5htnfuLWldvWldvW5dvW5dvWnTifx5njjTWnGxe+AuONNz9uXb1tXb1tXbltXblt3Ynzicw535hz -ufHhKzDfmPPztq7ftq7ftq7dtq7dtu7EeeHP+cqfy40VX4H5yp8fl0W5abvxZx7nzotvsHbjz+35 -/Lnd+PM2IBM+b8B248+3YX6OP5cbf643VnwFlht/Lm/y53bjz9v0423n4m3rTpxP5M/txp+3EeXb -1uXb1p04n8efy40/1xsrvgLLjT8/bl29bV29bV25bV25bd2J84n8ud348zaidtu6dtu6E+fz+HO5 -8ed6Y8VXYLnx58etM07arvx5Z45XjnllmSfW2aFxOfruVMb5u1Mbv0IVwdcb1tlfufVXrv3la3/5 -1t+JdfbXb/31a3/t2l+79XdiXcksWPgfkxEfgyb/37Or83AYWwSUGcaVMDX4jU1r4imO5Cm2/WBy -e113Y1efuMENdlMzVhgZFq+2uv/GE/iL7550vgz7asC4Gp6MNG/mhnPg6akDb5eBXzX4q+WlXAbe -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 - - - diff --git a/branding/logo/logoguidelines.md b/branding/logo/logoguidelines.md new file mode 100644 index 000000000000..0c37e3dd455e --- /dev/null +++ b/branding/logo/logoguidelines.md @@ -0,0 +1,18 @@ +# NumPy Logo Guidelines +These guidelines are meant to help keep the NumPy logo consistent and recognizable across all its uses. They also provide a common language for referring to the logos and their components. + +The primary logo is the horizontal option (logomark and text next to each other) and the secondary logo is the stacked version (logomark over text). I’ve also provided the logomark on its own (meaning it doesn’t have text). When in doubt, it’s preferable to use primary or secondary options over the logomark alone. + +## Color +The full color options are a combo of two shades of blue, rgb(77, 171, 207) and rgb(77, 119, 207), while light options are rgb(255, 255, 255) and dark options are rgb(1, 50, 67). + +Whenever possible, use the full color logos. One color logos (light or dark) are to be used when full color will not have enough contrast, usually when logos must be on colored backgrounds. + +## Minimum Size +Please do not make the primary logo smaller than 50px wide, secondary logo smaller than 35px wide, or logomark smaller than 20px wide. + +## Logo Integrity +A few other notes to keep in mind when using the logo: +- Make sure to scale the logo proportionally. +- Maintain a good amount of space around the logo. Don’t let it overlap with text, images, or other elements. +- Do not try and recreate or modify the logo. For example, do not use the logomark and then try to write NumPy in another font. diff --git a/branding/logo/logomark/numpylogoicon.png b/branding/logo/logomark/numpylogoicon.png new file mode 100644 index 000000000000..4d663fe0a479 Binary files /dev/null and b/branding/logo/logomark/numpylogoicon.png differ diff --git a/branding/logo/logomark/numpylogoicon.svg b/branding/logo/logomark/numpylogoicon.svg new file mode 100644 index 000000000000..50810223b355 --- /dev/null +++ b/branding/logo/logomark/numpylogoicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branding/logo/logomark/numpylogoicondark.png b/branding/logo/logomark/numpylogoicondark.png new file mode 100644 index 000000000000..eea3f32881a3 Binary files /dev/null and b/branding/logo/logomark/numpylogoicondark.png differ diff --git a/branding/logo/logomark/numpylogoiconlight.png b/branding/logo/logomark/numpylogoiconlight.png new file mode 100644 index 000000000000..a81b175a6649 Binary files /dev/null and b/branding/logo/logomark/numpylogoiconlight.png differ diff --git a/branding/logo/primary/numpylogo.png b/branding/logo/primary/numpylogo.png new file mode 100644 index 000000000000..8187b49c10ae Binary files /dev/null and b/branding/logo/primary/numpylogo.png differ diff --git a/branding/logo/primary/numpylogo.svg b/branding/logo/primary/numpylogo.svg new file mode 100644 index 000000000000..63d61c50f6a0 --- /dev/null +++ b/branding/logo/primary/numpylogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branding/logo/primary/numpylogodark.png b/branding/logo/primary/numpylogodark.png new file mode 100644 index 000000000000..e6d20af6be7d Binary files /dev/null and b/branding/logo/primary/numpylogodark.png differ diff --git a/branding/logo/primary/numpylogolight.png b/branding/logo/primary/numpylogolight.png new file mode 100644 index 000000000000..8500d1c10f27 Binary files /dev/null and b/branding/logo/primary/numpylogolight.png differ diff --git a/branding/logo/secondary/numpylogo2.png b/branding/logo/secondary/numpylogo2.png new file mode 100644 index 000000000000..000a197b3894 Binary files /dev/null and b/branding/logo/secondary/numpylogo2.png differ diff --git a/branding/logo/secondary/numpylogo2.svg b/branding/logo/secondary/numpylogo2.svg new file mode 100644 index 000000000000..20385487c94e --- /dev/null +++ b/branding/logo/secondary/numpylogo2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branding/logo/secondary/numpylogo2dark.png b/branding/logo/secondary/numpylogo2dark.png new file mode 100644 index 000000000000..3c866703c416 Binary files /dev/null and b/branding/logo/secondary/numpylogo2dark.png differ diff --git a/branding/logo/secondary/numpylogo2light.png b/branding/logo/secondary/numpylogo2light.png new file mode 100644 index 000000000000..98f00bc42ec8 Binary files /dev/null and b/branding/logo/secondary/numpylogo2light.png differ diff --git a/build_requirements.txt b/build_requirements.txt new file mode 100644 index 000000000000..b1cfe0e68f49 --- /dev/null +++ b/build_requirements.txt @@ -0,0 +1,6 @@ +meson-python>=0.13.1 +Cython>=3.0 +wheel==0.38.1 +ninja +spin==0.7 +build diff --git a/building_with_meson.md b/building_with_meson.md new file mode 100644 index 000000000000..2319c0c748cc --- /dev/null +++ b/building_with_meson.md @@ -0,0 +1,68 @@ +# Building with Meson + +_Note: this is for early adopters. It has been tested on Linux and macOS, and +with Python 3.9-3.12. Windows will be tested soon. There is one CI job to keep +the build stable. This may have rough edges, please open an issue if you run +into a problem._ + +### Developer build + +**Install build tools:** Use one of: + +- `mamba env create -f environment.yml && mamba activate numpy-dev` + +- `python -m pip install -r build_requirements.txt` + *Note: also make sure you have `pkg-config` and the usual system dependencies + for NumPy* + +Then install spin: +- `python -m pip install spin` + +**Compile and install:** `spin build` + +This builds in the `build/` directory, and installs into the `build-install` directory. + +Then run the test suite or a shell via `spin`: +``` +spin test +spin ipython +``` + +Alternatively, to use the package, add it to your `PYTHONPATH`: +``` +export PYTHONPATH=${PWD}/build/lib64/python3.10/site-packages # may vary +pytest --pyargs numpy +``` + + +### pip install + +Note that `pip` will use the default build system, which is now Meson. +Commands such as `pip install .` or `pip install --no-build-isolation .` +will work as expected, as does building an sdist or wheel with `python -m build`, +or `pip install -e . --no-build-isolation` for an editable install. +For a more complete developer experience than editable installs, consider using +`spin` instead though (see above). + + +### Workaround for a hiccup on Fedora + +- Fedora does not distribute `openblas.pc`. Install the following file in `~/lib/pkgconfig/openblas.pc`: + +``` +prefix=/usr +includedir=${prefix}/include +libdir=${prefix}/lib64 + +Name: openblas +Description: OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version +Version: 0.3.19 +Cflags: -I${includedir}/openblas +Libs: -L${libdir} -lopenblas +``` + +Then build with: + +``` +spin build -- -Dpkg_config_path=${HOME}/lib/pkgconfig +``` diff --git a/doc/BRANCH_WALKTHROUGH.rst b/doc/BRANCH_WALKTHROUGH.rst new file mode 100644 index 000000000000..2d26eebc242a --- /dev/null +++ b/doc/BRANCH_WALKTHROUGH.rst @@ -0,0 +1,78 @@ +This guide 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 +:ref:`general release guide `. + +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. + diff --git a/doc/C_STYLE_GUIDE.rst b/doc/C_STYLE_GUIDE.rst new file mode 100644 index 000000000000..60d2d7383510 --- /dev/null +++ b/doc/C_STYLE_GUIDE.rst @@ -0,0 +1,3 @@ + +The "NumPy C Style Guide" at this page has been superseded by +"NEP 45 — C Style Guide" at https://numpy.org/neps/nep-0045-c_style_guide.html diff --git a/doc/DISTUTILS.rst.txt b/doc/DISTUTILS.rst similarity index 91% rename from doc/DISTUTILS.rst.txt rename to doc/DISTUTILS.rst index bcef82500ba4..539a3b9c121a 100644 --- a/doc/DISTUTILS.rst.txt +++ b/doc/DISTUTILS.rst @@ -59,7 +59,7 @@ SciPy pure Python package example Below is an example of a minimal ``setup.py`` file for a pure SciPy package:: - #!/usr/bin/env python + #!/usr/bin/env python3 def configuration(parent_package='',top_path=None): from numpy.distutils.misc_util import Configuration config = Configuration('mypackage',parent_package,top_path) @@ -345,7 +345,7 @@ expression, '<...>' will be replaced first with item1, and then with item2, and so forth until N repeats are accomplished. Once a named repeat specification has been introduced, the same repeat rule may be used **in the current block** by referring only to the name -(i.e. . +(i.e. ). Short repeat rule @@ -385,46 +385,46 @@ that should be repeated using a variable expansion similar to the named repeat rules of the Fortran-specific repeats. NumPy Distutils preprocesses C source files (extension: :file:`.c.src`) written -in a custom templating language to generate C code. The :c:data:`@` symbol is +in a custom templating language to generate C code. The ``@`` symbol is used to wrap macro-style variables to empower a string substitution mechanism that might describe (for instance) a set of data types. -The template language blocks are delimited by :c:data:`/**begin repeat` -and :c:data:`/**end repeat**/` lines, which may also be nested using -consecutively numbered delimiting lines such as :c:data:`/**begin repeat1` -and :c:data:`/**end repeat1**/`: +The template language blocks are delimited by ``/**begin repeat`` +and ``/**end repeat**/`` lines, which may also be nested using +consecutively numbered delimiting lines such as ``/**begin repeat1`` +and ``/**end repeat1**/``: -1. "/\**begin repeat "on a line by itself marks the beginning of -a segment that should be repeated. +1. ``/**begin repeat`` on a line by itself marks the beginning of + a segment that should be repeated. 2. Named variable expansions are defined using ``#name=item1, item2, item3, -..., itemN#`` and placed on successive lines. These variables are -replaced in each repeat block with corresponding word. All named -variables in the same repeat block must define the same number of -words. + ..., itemN#`` and placed on successive lines. These variables are + replaced in each repeat block with corresponding word. All named + variables in the same repeat block must define the same number of + words. 3. In specifying the repeat rule for a named variable, ``item*N`` is short- -hand for ``item, item, ..., item`` repeated N times. In addition, -parenthesis in combination with \*N can be used for grouping several -items that should be repeated. Thus, #name=(item1, item2)*4# is -equivalent to #name=item1, item2, item1, item2, item1, item2, item1, -item2# + hand for ``item, item, ..., item`` repeated N times. In addition, + parenthesis in combination with ``*N`` can be used for grouping several + items that should be repeated. Thus, ``#name=(item1, item2)*4#`` is + equivalent to ``#name=item1, item2, item1, item2, item1, item2, item1, + item2#``. -4. "\*/ "on a line by itself marks the end of the variable expansion -naming. The next line is the first line that will be repeated using -the named rules. +4. ``*/`` on a line by itself marks the end of the variable expansion + naming. The next line is the first line that will be repeated using + the named rules. 5. Inside the block to be repeated, the variables that should be expanded -are specified as ``@name@`` + are specified as ``@name@``. -6. "/\**end repeat**/ "on a line by itself marks the previous line -as the last line of the block to be repeated. +6. ``/**end repeat**/`` on a line by itself marks the previous line + as the last line of the block to be repeated. 7. A loop in the NumPy C source code may have a ``@TYPE@`` variable, targeted -for string substitution, which is preprocessed to a number of otherwise -identical loops with several strings such as INT, LONG, UINT, ULONG. The -``@TYPE@`` style syntax thus reduces code duplication and maintenance burden by -mimicking languages that have generic type support. + for string substitution, which is preprocessed to a number of otherwise + identical loops with several strings such as ``INT``, ``LONG``, ``UINT``, + ``ULONG``. The ``@TYPE@`` style syntax thus reduces code duplication and + maintenance burden by mimicking languages that have generic type support. The above rules may be clearer in the following template source example: @@ -464,15 +464,15 @@ The above rules may be clearer in the following template source example: /**end repeat**/ -The preprocessing of generically typed C source files (whether in NumPy +The preprocessing of generically-typed C source files (whether in NumPy proper or in any third party package using NumPy Distutils) is performed by `conv_template.py`_. -The type specific C files generated (extension: .c) +The type-specific C files generated (extension: ``.c``) by these modules during the build process are ready to be compiled. This form of generic typing is also supported for C header files (preprocessed -to produce .h files). +to produce ``.h`` files). -.. _conv_template.py: https://github.com/numpy/numpy/blob/master/numpy/distutils/conv_template.py +.. _conv_template.py: https://github.com/numpy/numpy/blob/main/numpy/distutils/conv_template.py Useful functions in ``numpy.distutils.misc_util`` ------------------------------------------------- @@ -577,9 +577,6 @@ The header of a typical SciPy ``__init__.py`` is:: Package docstring, typically with a brief description and function listing. """ - # py3k related imports - from __future__ import division, print_function, absolute_import - # import functions into module namespace from .subpackage import * ... @@ -590,10 +587,6 @@ The header of a typical SciPy ``__init__.py`` is:: test = Tester().test bench = Tester().bench -Note that NumPy submodules still use a file named ``info.py`` in which the -module docstring and ``__all__`` dict are defined. These files will be removed -at some point. - Extra features in NumPy Distutils ''''''''''''''''''''''''''''''''' diff --git a/doc/EXAMPLE_DOCSTRING.rst.txt b/doc/EXAMPLE_DOCSTRING.rst similarity index 76% rename from doc/EXAMPLE_DOCSTRING.rst.txt rename to doc/EXAMPLE_DOCSTRING.rst index 55294f6568c4..d7ddf5260abf 100644 --- a/doc/EXAMPLE_DOCSTRING.rst.txt +++ b/doc/EXAMPLE_DOCSTRING.rst @@ -9,7 +9,7 @@ multivariate_normal(mean, cov[, shape]) Draw samples from a multivariate normal distribution. The multivariate normal, multinormal or Gaussian distribution is a -generalisation of the one-dimensional normal distribution to higher +generalization of the one-dimensional normal distribution to higher dimensions. Such a distribution is specified by its mean and covariance matrix, @@ -21,22 +21,22 @@ Parameters ---------- mean : (N,) ndarray Mean of the N-dimensional distribution. -cov : (N,N) ndarray +cov : (N, N) ndarray Covariance matrix of the distribution. shape : tuple of ints, optional - Given a shape of, for example, (m,n,k), m*n*k samples are + Given a shape of, for example, (m, n, k), m*n*k samples are generated, and packed in an m-by-n-by-k arrangement. Because each - sample is N-dimensional, the output shape is (m,n,k,N). If no + sample is N-dimensional, the output shape is (m, n, k, N). If no shape is specified, a single sample is returned. Returns ------- out : ndarray The drawn samples, arranged according to `shape`. If the - shape given is (m,n,...), then the shape of `out` is - (m,n,...,N). + shape given is (m, n, ...), then the shape of `out` is + (m, n, ... , N). - In other words, each entry ``out[i,j,...,:]`` is an N-dimensional + In other words, each entry ``out[i, j, ... , :]`` is an N-dimensional value drawn from the distribution. See Also @@ -54,7 +54,7 @@ univariate normal distribution. Covariance indicates the level to which two variables vary together. From the multivariate normal distribution, we draw N-dimensional -samples, :math:`X = [x_1, x_2, ... x_N]`. The covariance matrix +samples, :math:`X = [x_1, x_2, ... , x_N]`. The covariance matrix element :math:`C_ij` is the covariance of :math:`x_i` and :math:`x_j`. The element :math:`C_ii` is the variance of :math:`x_i` (i.e. its "spread"). @@ -69,12 +69,12 @@ approximations include: This geometrical property can be seen in two dimensions by plotting generated data-points: ->>> mean = [0,0] ->>> cov = [[1,0],[0,100]] # diagonal covariance, points lie on x or y-axis ->>> x,y = np.random.multivariate_normal(mean,cov,5000).T +>>> mean = [0, 0] +>>> cov = [[1, 0], [0, 100]] # diagonal covariance, points lie on x or y-axis +>>> x, y = np.random.multivariate_normal(mean, cov, 5000).T >>> import matplotlib.pyplot as plt ->>> plt.plot(x,y,'x'); plt.axis('equal'); pyplot.show() +>>> plt.plot(x, y, 'x'); plt.axis('equal'); plt.show() Note that the covariance matrix must be non-negative definite. @@ -87,17 +87,17 @@ References Examples -------- ->>> mean = (1,2) ->>> cov = [[1,0],[1,0]] ->>> x = np.random.multivariate_normal(mean,cov,(3,3)) +>>> mean = (1, 2) +>>> cov = [[1, 0], [0, 1]] +>>> x = np.random.multivariate_normal(mean, cov, (3, 3)) >>> x.shape (3, 3, 2) The following is probably true, given that 0.6 is roughly twice the standard deviation: ->>> print list( (x[0,0,:] - mean) < 0.6 ) -[True, True] +>>> print(list( (x[0, 0, :] - mean) < 0.6 )) +[True, True] # may vary .. index: :refguide: random:distributions diff --git a/doc/HOWTO_DOCUMENT.rst.txt b/doc/HOWTO_DOCUMENT.rst similarity index 100% rename from doc/HOWTO_DOCUMENT.rst.txt rename to doc/HOWTO_DOCUMENT.rst diff --git a/doc/HOWTO_RELEASE.rst b/doc/HOWTO_RELEASE.rst new file mode 100644 index 000000000000..d4dbb504ea5d --- /dev/null +++ b/doc/HOWTO_RELEASE.rst @@ -0,0 +1,247 @@ +These instructions give an overview of what is necessary to build binary +releases for NumPy. + +Current build and release info +============================== + +Useful info can be found in the following locations: + +* **Source tree** + + - `INSTALL.rst `_ + - `pavement.py `_ + +* **NumPy docs** + + - https://github.com/numpy/numpy/blob/main/doc/HOWTO_RELEASE.rst + - https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst + - https://github.com/numpy/numpy/blob/main/doc/BRANCH_WALKTHROUGH.rst + +* **Release scripts** + + - https://github.com/numpy/numpy-vendor + + +Supported platforms and versions +================================ +:ref:`NEP 29 ` outlines which Python versions +are supported; For the first half of 2020, this will be Python >= 3.6. We test +NumPy against all these versions every time we merge code to main. Binary +installers may be available for a subset of these versions (see below). + +* **OS X** + + OS X versions >= 10.9 are supported, for Python version support see + :ref:`NEP 29 `. We build binary wheels for OSX that are compatible with + Python.org Python, system Python, homebrew and macports - see this + `OSX wheel building summary `_ + for details. + +* **Windows** + + We build 32- and 64-bit wheels on Windows. Windows 7, 8 and 10 are supported. + We build NumPy using the `mingw-w64 toolchain`_, `cibuildwheels`_ and GitHub + actions. + +.. _cibuildwheels: https://cibuildwheel.readthedocs.io/en/stable/ + +* **Linux** + + We build and ship `manylinux2014 `_ + wheels for NumPy. Many Linux distributions include their own binary builds + of NumPy. + +* **BSD / Solaris** + + No binaries are provided, but successful builds on Solaris and BSD have been + reported. + +Tool chain +========== +We build all our wheels on cloud infrastructure - so this list of compilers is +for information and debugging builds locally. See the ``.travis.yml`` script +in the `numpy wheels`_ repo for an outdated source of the build recipes using +multibuild. + +.. _numpy wheels : https://github.com/MacPython/numpy-wheels + +Compilers +--------- +The same gcc version is used as the one with which Python itself is built on +each platform. At the moment this means: + +- OS X builds on travis currently use `clang`. It appears that binary wheels + for OSX >= 10.6 can be safely built from the travis-ci OSX 10.9 VMs + when building against the Python from the Python.org installers; +- Windows builds use the `mingw-w64 toolchain`_; +- Manylinux2014 wheels use the gcc provided on the Manylinux docker images. + +You will need Cython for building the binaries. Cython compiles the ``.pyx`` +files in the NumPy distribution to ``.c`` files. + +.. _mingw-w64 toolchain : https://mingwpy.github.io + +OpenBLAS +-------- + +All the wheels link to a version of OpenBLAS_ supplied via the openblas-libs_ repo. +The shared object (or DLL) is shipped with in the wheel, renamed to prevent name +collisions with other OpenBLAS shared objects that may exist in the filesystem. + +.. _OpenBLAS: https://github.com/xianyi/OpenBLAS +.. _openblas-libs: https://github.com/MacPython/openblas-libs + + +Building source archives and wheels +----------------------------------- +The NumPy wheels and sdist are now built using cibuildwheel with +github actions. + + +Building docs +------------- +We are no longer building pdf files, only html docs. The ``numpy-html.zip`` +needed to upload to the doc server can be built with ``spin docs dist``. + +To install the necessary doc build dependencies into your development +environment, run ``pip install -r doc_requirements.txt``. + + +Uploading to PyPI +----------------- +The only application needed for uploading is + +- twine (pip). + +You will also need a PyPI token, which is best kept on a keyring. See the +twine keyring_ documentation for how to do that. + +.. _keyring: https://twine.readthedocs.io/en/stable/#keyring-support + + +Generating author/PR lists +-------------------------- +You will need a personal access token +``_ +so that scripts can access the github NumPy repository. + +- gitpython (pip) +- pygithub (pip) + + +What is released +================ + +* **Wheels** + We currently support Python 3.8-3.10 on Windows, OSX, and Linux. + + * Windows: 32-bit and 64-bit wheels built using Github actions; + * OSX: x64_86 and arm64 OSX wheels built using Github actions; + * Linux: x64_86 and aarch64 Manylinux2014 wheels built using Github actions. + +* **Other** + Release notes and changelog + +* **Source distribution** + We build source releases in the .tar.gz format. + + +Release process +=============== + +Agree on a release schedule +--------------------------- +A typical release schedule is one beta, two release candidates and a final +release. It's best to discuss the timing on the mailing list first, in order +for people to get their commits in on time, get doc wiki edits merged, etc. +After a date is set, create a new maintenance/x.y.z branch, add new empty +release notes for the next version in the main branch and update the Trac +Milestones. + + +Make sure current branch builds a package correctly +--------------------------------------------------- +The CI builds wheels when a PR header begins with ``REL``. Your last +PR before releasing should be so marked and all the tests should pass. +You can also do:: + + git clean -fxdq + python setup.py bdist_wheel + python setup.py sdist + +For details of the build process itself, it is best to read the +Step-by-Step Directions below. + +.. note:: The following steps are repeated for the beta(s), release + candidates(s) and the final release. + + +Check deprecations +------------------ +Before :ref:`the release branch is made `, it should be checked that +all deprecated code that should be removed is actually removed, and all new +deprecations say in the docstring or deprecation warning what version the code +will be removed. + +Check the C API version number +------------------------------ +The C API version needs to be tracked in three places + +- numpy/core/setup_common.py +- numpy/core/code_generators/cversions.txt +- numpy/core/include/numpy/numpyconfig.h + +There are three steps to the process. + +1. If the API has changed, increment the C_API_VERSION in setup_common.py. The + API is unchanged only if any code compiled against the current API will be + backward compatible with the last released NumPy version. Any changes to + C structures or additions to the public interface will make the new API + not backward compatible. + +2. If the C_API_VERSION in the first step has changed, or if the hash of + the API has changed, the cversions.txt file needs to be updated. To check + the hash, run the script numpy/core/cversions.py and note the API hash that + is printed. If that hash does not match the last hash in + numpy/core/code_generators/cversions.txt the hash has changed. Using both + the appropriate C_API_VERSION and hash, add a new entry to cversions.txt. + If the API version was not changed, but the hash differs, you will need to + comment out the previous entry for that API version. For instance, in NumPy + 1.9 annotations were added, which changed the hash, but the API was the + same as in 1.8. The hash serves as a check for API changes, but it is not + definitive. + + If steps 1 and 2 are done correctly, compiling the release should not give + a warning "API mismatch detect at the beginning of the build". + +3. The numpy/core/include/numpy/numpyconfig.h will need a new + NPY_X_Y_API_VERSION macro, where X and Y are the major and minor version + numbers of the release. The value given to that macro only needs to be + increased from the previous version if some of the functions or macros in + the include files were deprecated. + +The C ABI version number in numpy/core/setup_common.py should only be +updated for a major release. + + +Check the release notes +----------------------- +Use `towncrier`_ to build the release note and +commit the changes. This will remove all the fragments from +``doc/release/upcoming_changes`` and add ``doc/release/-note.rst``. + + towncrier build --version "" + git commit -m"Create release note" + +Check that the release notes are up-to-date. + +Update the release notes with a Highlights section. Mention some of the +following: + +- major new features +- deprecated and removed features +- supported Python versions +- for SciPy, supported NumPy version(s) +- outlook for the near future + +.. _towncrier: https://pypi.org/project/towncrier/ diff --git a/doc/HOWTO_RELEASE.rst.txt b/doc/HOWTO_RELEASE.rst.txt deleted file mode 100644 index 53359f0a2ebc..000000000000 --- a/doc/HOWTO_RELEASE.rst.txt +++ /dev/null @@ -1,484 +0,0 @@ -This file gives an overview of what is necessary to build binary releases for -NumPy. - -Current build and release info -============================== - -The current info on building and releasing NumPy and SciPy is scattered in -several places. It should be summarized in one place, updated, and where -necessary described in more detail. The sections below list all places where -useful info can be found. - -Source tree ------------ -* INSTALL.rst.txt -* release.sh -* pavement.py - -NumPy Docs ----------- -* https://github.com/numpy/numpy/blob/master/doc/HOWTO_RELEASE.rst.txt -* http://projects.scipy.org/numpy/wiki/MicrosoftToolchainSupport (dead link) - -SciPy.org wiki --------------- -* https://www.scipy.org/Installing_SciPy and links on that page. -* http://new.scipy.org/building/windows.html (dead link) - -Doc wiki --------- -* http://docs.scipy.org/numpy/docs/numpy-docs/user/install.rst/ (dead link) - -Release Scripts ---------------- -* https://github.com/numpy/numpy-vendor - -Supported platforms and versions -================================ - -Python 2.7 and >=3.4 are the currently supported versions when building from -source. We test NumPy against all these versions every time we merge code to -master. Binary installers may be available for a subset of these versions (see -below). - -OS X ----- - -Python 2.7 and >=3.4 are the versions for which we provide binary installers. -OS X versions >= 10.6 are supported. We build binary wheels for OSX that are -compatible with Python.org Python, system Python, homebrew and macports - see -this `OSX wheel building summary -`_ for details. - -Windows -------- - -We build 32- and 64-bit wheels for Python 2.7, 3.4, 3.5 on Windows. Windows -XP, Vista, 7, 8 and 10 are supported. We build NumPy using the MSVC compilers -on Appveyor, but we are hoping to update to a `mingw-w64 toolchain -`_. The Windows wheels use ATLAS for BLAS / LAPACK. - -Linux ------ - -We build and ship `manylinux1 `_ -wheels for NumPy. Many Linux distributions include their own binary builds -of NumPy. - -BSD / Solaris -------------- - -No binaries are provided, but successful builds on Solaris and BSD have been -reported. - -Tool chain -========== - -We build all our wheels on cloud infrastructure - so this list of compilers is -for information and debugging builds locally. See the ``.travis.yml`` and -``appveyor.yml`` scripts in the `numpy wheels`_ repo for the definitive source -of the build recipes. Packages that are available using pip are noted. - -Compilers ---------- - -The same gcc version is used as the one with which Python itself is built on -each platform. At the moment this means: - -* OS X builds on travis currently use `clang`. It appears that binary wheels - for OSX >= 10.6 can be safely built from the travis-ci OSX 10.9 VMs - when building against the Python from the Python.org installers; -* Windows builds use the MSVC version corresponding to the Python being built - against; -* Manylinux1 wheels use the gcc provided on the Manylinux docker images. - -You will need Cython for building the binaries. Cython compiles the ``.pyx`` -files in the NumPy distribution to ``.c`` files. - -Building source archives and wheels ------------------------------------ - -You will need write permission for numpy-wheels in order to trigger wheel -builds. - -* Python(s) from `python.org `_ or linux distro. -* cython -* virtualenv (pip) -* Paver (pip) -* numpy-wheels ``_ (clone) - -Building docs -------------- - -Building the documents requires a number of latex ``.sty`` files. Install them -all to avoid aggravation. - -* Sphinx (pip) -* numpydoc (pip) -* Matplotlib -* Texlive (or MikTeX on Windows) - -Uploading to PyPI ------------------ - -* terryfy ``_ (clone). -* beautifulsoup4 (pip) -* delocate (pip) -* auditwheel (pip) -* twine (pip) - -Generating author/pr lists --------------------------- - -You will need a personal access token -``_ -so that scripts can access the github NumPy repository. - -* gitpython (pip) -* pygithub (pip) - -Virtualenv ----------- - -Virtualenv is a very useful tool to keep several versions of packages around. -It is also used in the Paver script to build the docs. - - -What is released -================ - -Wheels ------- - -* Windows wheels for Python 2.7, 3.4, 3.5, for 32- and 64-bit, built using - Appveyor; -* Dual architecture OSX wheels built via travis-ci; -* 32- and 64-bit Manylinux1 wheels built via travis-ci. - -See the `numpy wheels`_ building repository for more detail. - -.. _numpy wheels : https://github.com/MacPython/numpy-wheels - -Other ------ - -* Release Notes -* Changelog - -Source distribution -------------------- - -We build source releases in both .zip and .tar.gz formats. - -Release process -=============== - -Agree on a release schedule ---------------------------- -A typical release schedule is one beta, two release candidates and a final -release. It's best to discuss the timing on the mailing list first, in order -for people to get their commits in on time, get doc wiki edits merged, etc. -After a date is set, create a new maintenance/x.y.z branch, add new empty -release notes for the next version in the master branch and update the Trac -Milestones. - -Make sure current branch builds a package correctly ---------------------------------------------------- -:: - - git clean -fxd - python setup.py bdist - 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 -best to read the pavement.py script. - -.. note:: The following steps are repeated for the beta(s), release - candidates(s) and the final release. - -Check deprecations ------------------- -Before the release branch is made, it should be checked that all deprecated -code that should be removed is actually removed, and all new deprecations say -in the docstring or deprecation warning at what version the code will be -removed. - -Check the C API version number ------------------------------- -The C API version needs to be tracked in three places - -- numpy/core/setup_common.py -- numpy/core/code_generators/cversions.txt -- numpy/core/include/numpy/numpyconfig.h - -There are three steps to the process. - -1. If the API has changed, increment the C_API_VERSION in setup_common.py. The - API is unchanged only if any code compiled against the current API will be - backward compatible with the last released NumPy version. Any changes to - C structures or additions to the public interface will make the new API - not backward compatible. - -2. If the C_API_VERSION in the first step has changed, or if the hash of - the API has changed, the cversions.txt file needs to be updated. To check - the hash, run the script numpy/core/cversions.py and note the API hash that - is printed. If that hash does not match the last hash in - numpy/core/code_generators/cversions.txt the hash has changed. Using both - the appropriate C_API_VERSION and hash, add a new entry to cversions.txt. - If the API version was not changed, but the hash differs, you will need to - comment out the previous entry for that API version. For instance, in NumPy - 1.9 annotations were added, which changed the hash, but the API was the - same as in 1.8. The hash serves as a check for API changes, but it is not - definitive. - - If steps 1 and 2 are done correctly, compiling the release should not give - a warning "API mismatch detect at the beginning of the build". - -3. The numpy/core/include/numpy/numpyconfig.h will need a new - NPY_X_Y_API_VERSION macro, where X and Y are the major and minor version - numbers of the release. The value given to that macro only needs to be - increased from the previous version if some of the functions or macros in - the include files were deprecated. - -The C ABI version number in numpy/core/setup_common.py should only be -updated for a major release. - -Check the release notes ------------------------ -Use `towncrier`_ to build the release note and -commit the changes. This will remove all the fragments from -``doc/release/upcoming_changes`` and add ``doc/release/-note.rst``. -Note that currently towncrier must be installed from its master branch as the -last release (19.2.0) is outdated. - - towncrier --version "" - git commit -m"Create release note" - -Check that the release notes are up-to-date. - -Update the release notes with a Highlights section. Mention some of the -following: - - - major new features - - deprecated and removed features - - supported Python versions - - for SciPy, supported NumPy version(s) - - outlook for the near future - -.. _towncrier: https://github.com/hawkowl/towncrier - -Update the release status and create a release "tag" ----------------------------------------------------- -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 -release version:: - - RELEASE_NOTES = 'doc/release/1.7.0-notes.rst' - LOG_START = 'v1.6.0' - LOG_END = 'maintenance/1.7.x' - -Do any other changes. When you are ready to release, do the following -changes:: - - diff --git a/setup.py b/setup.py - index b1f53e3..8b36dbe 100755 - --- a/setup.py - +++ b/setup.py - @@ -57,7 +57,7 @@ PLATFORMS = ["Windows", "Linux", "Solaris", "Mac OS- - MAJOR = 1 - MINOR = 7 - MICRO = 0 - -ISRELEASED = False - +ISRELEASED = True - VERSION = '%d.%d.%drc1' % (MAJOR, MINOR, MICRO) - - # Return the git revision as a string - -And make sure the ``VERSION`` variable is set properly. - -Now you can make the release commit and tag. We recommend you don't push -the commit or tag immediately, just in case you need to do more cleanup. We -prefer to defer the push of the tag until we're confident this is the exact -form of the released code (see: :ref:`push-tag-and-commit`): - - git commit -s -m "REL: Release." setup.py - git tag -s - -The ``-s`` flag makes a PGP (usually GPG) signed tag. Please do sign the -release tags. - -The release tag should have the release number in the annotation (tag -message). Unfortunately, the name of a tag can be changed without breaking the -signature, the contents of the message cannot. - -See: https://github.com/scipy/scipy/issues/4919 for a discussion of signing -release tags, and https://keyring.debian.org/creating-key.html for instructions -on creating a GPG key if you do not have one. - -To make your key more readily identifiable as you, consider sending your key -to public keyservers, with a command such as:: - - gpg --send-keys - -Apply patch to fix bogus strides --------------------------------- -NPY_RELAXED_STRIDE_CHECKING was made the default in NumPy 1.10.0 and bogus -strides are used in the development branch to smoke out problems. The -`patch `_ should be updated if -necessary and applied to the release branch to rationalize the strides. - -Update the version of the master branch ---------------------------------------- -Increment the release number in setup.py. Release candidates should have "rc1" -(or "rc2", "rcN") appended to the X.Y.Z format. - -Also create a new version hash in cversions.txt and a corresponding version -define NPY_x_y_API_VERSION in numpyconfig.h - -Trigger the wheel builds on travis-ci and Appveyor --------------------------------------------------- - -See the `numpy wheels` repository. - -In that repository edit the files: - -* ``.travis.yml``; -* ``appveyor.yml``. - -In both cases, set the ``BUILD_COMMIT`` variable to the current release tag - -e.g. ``v1.11.1``. - -Make sure that the release tag has been pushed. - -Trigger a build by doing a commit of your edits to ``.travis.yml`` and -``appveyor.yml`` to the repository:: - - cd /path/to/numpy-wheels - # Edit .travis.yml, appveyor.yml - git commit - git push - -The wheels, once built, appear at a Rackspace container pointed at by: - -* http://wheels.scipy.org -* https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com - -The HTTP address may update first, and you should wait 15 minutes after the -build finishes before fetching the binaries. - -Make the release ----------------- - -Build the changelog and notes for upload with:: - - paver write_release_and_log - -Build and archive documentation -------------------------------- -Do:: - - cd doc/ - make dist - -to check that the documentation is in a buildable state. Then, after tagging, -create an archive of the documentation in the numpy/doc repo:: - - # This checks out github.com/numpy/doc and adds (``git add``) the - # documentation to the checked out repo. - make merge-doc - # Now edit the ``index.html`` file in the repo to reflect the new content, - # and commit the changes - git -C dist/merge commit -a "Add documentation for " - # Push to numpy/doc repo - git -C push - -Update PyPI ------------ - -The wheels and source should be uploaded to PyPI. - -You should upload the wheels first, and the source formats last, to make sure -that pip users don't accidentally get a source install when they were -expecting a binary wheel. - -You can do this automatically using the ``wheel-uploader`` script from -https://github.com/MacPython/terryfy. Here is the recommended incantation for -downloading all the Windows, Manylinux, OSX wheels and uploading to PyPI. :: - - NPY_WHLS=~/wheelhouse # local directory to cache wheel downloads - CDN_URL=https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com - wheel-uploader -u $CDN_URL -w $NPY_WHLS -v -s -t win numpy 1.11.1rc1 - wheel-uploader -u $CDN_URL -w warehouse -v -s -t macosx numpy 1.11.1rc1 - wheel-uploader -u $CDN_URL -w warehouse -v -s -t manylinux1 numpy 1.11.1rc1 - -The ``-v`` flag gives verbose feedback, ``-s`` causes the script to sign the -wheels with your GPG key before upload. Don't forget to upload the wheels -before the source tarball, so there is no period for which people switch from -an expected binary install to a source install from PyPI. - -There are two ways to update the source release on PyPI, the first one is:: - - $ git clean -fxd # to be safe - $ python setup.py sdist --formats=gztar,zip # to check - # python setup.py sdist --formats=gztar,zip upload --sign - -This will ask for your key PGP passphrase, in order to sign the built source -packages. - -The second way is to upload the PKG_INFO file inside the sdist dir in the -web interface of PyPI. The source tarball can also be uploaded through this -interface. - -.. _push-tag-and-commit: - -Push the release tag and commit -------------------------------- - -Finally, now you are confident this tag correctly defines the source code that -you released you can push the tag and release commit up to github:: - - git push # Push release commit - git push upstream # Push tag named - -where ``upstream`` points to the main https://github.com/numpy/numpy.git -repository. - -Update scipy.org ----------------- - -A release announcement with a link to the download site should be placed in the -sidebar of the front page of scipy.org. - -The scipy.org should be a PR at https://github.com/scipy/scipy.org. The file -that needs modification is ``www/index.rst``. Search for ``News``. - -Announce to the lists ---------------------- - -The release should be announced on the mailing lists of -NumPy and SciPy, to python-announce, and possibly also those of -Matplotlib, IPython and/or Pygame. - -During the beta/RC phase, an explicit request for testing the binaries with -several other libraries (SciPy/Matplotlib/Pygame) should be posted on the -mailing list. - -Announce to Linux Weekly News ------------------------------ - -Email the editor of LWN to let them know of the release. Directions at: -https://lwn.net/op/FAQ.lwn#contact - -After the final release ------------------------ -After the final release is announced, a few administrative tasks are left to be -done: - - - Forward port changes in the release branch to release notes and release - scripts, if any, to master branch. - - Update the Milestones in Trac. diff --git a/doc/Makefile b/doc/Makefile index 3c32cb811943..7e81d95058e0 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -14,6 +14,7 @@ PYTHON = python$(PYVER) SPHINXOPTS ?= SPHINXBUILD ?= LANG=C sphinx-build PAPER ?= +DOXYGEN ?= doxygen # For merging a documentation archive into a git checkout of numpy/doc # Turn a tag like v1.18.0 into 1.18 # Use sed -n -e 's/patttern/match/p' to return a blank value if no match @@ -25,32 +26,42 @@ FILES= PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -WT --keep-going -d build/doctrees $(PAPEROPT_$(PAPER)) \ - $(SPHINXOPTS) source + $(SPHINXOPTS) source -.PHONY: help clean html web pickle htmlhelp latex changes linkcheck \ - dist dist-build gitwash-update version-check html-build latex-build \ - merge-doc +.PHONY: help clean html web htmlhelp latex changes linkcheck \ + dist dist-build gitwash-update version-check html-build latex-build \ + merge-doc show docenv #------------------------------------------------------------------------------ help: @echo "Please use \`make ' where is one of" + @echo " clean to remove generated doc files and start fresh" + @echo " docenv make a virtual environment in which to build docs" @echo " html to make standalone HTML files" - @echo " html-scipyorg to make standalone HTML files with scipy.org theming" - @echo " pickle to make pickle files (usable by e.g. sphinx-web)" @echo " htmlhelp to make HTML files and a HTML help project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview over all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " dist PYVER=... to make a distribution-ready tree" @echo " gitwash-update GITWASH=path/to/gitwash update gitwash developer docs" - @echo " upload USERNAME=... RELEASE=... to upload built docs to docs.scipy.org" @echo " merge-doc TAG=... to clone numpy/doc and archive documentation into it" + @echo " show to show the html output in a browser" clean: - -rm -rf build/* + -rm -rf build/* find . -name generated -type d -prune -exec rm -rf "{}" ";" +docenv: + $(PYTHON) -mvenv docenv + ( \ + . docenv/bin/activate; \ + pip install -q --upgrade pip; \ + pip install -q -r ../test_requirements.txt; \ + pip install -q -r ../doc_requirements.txt; \ + pip install -q ..; \ + ) + gitwash-update: rm -rf source/dev/gitwash install -d source/dev/gitwash @@ -65,28 +76,20 @@ gitwash-update: # Build the current numpy version, and extract docs from it. # We have to be careful of some issues: -# +# # - Everything must be done using the same Python version -# - We must use eggs (otherwise they might override PYTHONPATH on import). -# - Different versions of easy_install install to different directories (!) # - -INSTALL_DIR = $(CURDIR)/build/inst-dist -INSTALL_PPH = $(INSTALL_DIR)/lib/python$(PYVER)/site-packages:$(INSTALL_DIR)/local/lib/python$(PYVER)/site-packages:$(INSTALL_DIR)/lib/python$(PYVER)/dist-packages:$(INSTALL_DIR)/local/lib/python$(PYVER)/dist-packages -UPLOAD_DIR=/srv/docs_scipy_org/doc/numpy-$(RELEASE) - -DIST_VARS=SPHINXBUILD="LANG=C PYTHONPATH=$(INSTALL_PPH) python$(PYVER) `which sphinx-build`" PYTHON="PYTHONPATH=$(INSTALL_PPH) python$(PYVER)" - -NUMPYVER:=$(shell $(PYTHON) -c "import numpy; print(numpy.version.git_revision[:10])" 2>/dev/null) -GITVER ?= $(shell cd ..; $(PYTHON) -c "from setup import git_version; \ - print(git_version()[:10])") +#SPHINXBUILD="LANG=C sphinx-build" +NUMPYVER:=$(shell $(PYTHON) -c "import numpy; print(numpy.version.git_revision[:7])" 2>/dev/null) +GITVER ?= $(shell (cd ..; set -o pipefail && git rev-parse HEAD 2>/dev/null | cut -c1-7) || echo Unknown) version-check: ifeq "$(GITVER)" "Unknown" # @echo sdist build with unlabeled sources else ifeq ("", "$(NUMPYVER)") @echo numpy not found, cannot build documentation without successful \"import numpy\" + @echo Try overriding the makefile PYTHON variable with '"make PYTHON=python $(MAKECMDGOALS)"' @exit 1 else ifneq ($(NUMPYVER),$(GITVER)) @echo installed numpy $(NUMPYVER) != current repo git version \'$(GITVER)\' @@ -100,45 +103,15 @@ endif dist: build/dist.tar.gz -build/dist.tar.gz: - make $(DIST_VARS) real-dist +build/dist.tar.gz: real-dist -real-dist: dist-build html-build html-scipyorg - test -d build/latex || make latex-build - make -C build/latex all-pdf - -rm -rf build/dist - cp -r build/html-scipyorg build/dist +real-dist: html-build + cp -r build/html build/dist cd build/html && zip -9r ../dist/numpy-html.zip . - cp build/latex/numpy-ref.pdf build/dist - cp build/latex/numpy-user.pdf build/dist cd build/dist && tar czf ../dist.tar.gz * chmod ug=rwX,o=rX -R build/dist find build/dist -type d -print0 | xargs -0r chmod g+s -dist-build: - rm -f ../dist/*.egg - cd .. && $(PYTHON) setup.py bdist_egg - install -d $(subst :, ,$(INSTALL_PPH)) - $(PYTHON) `which easy_install` --prefix=$(INSTALL_DIR) ../dist/*.egg - -upload: build/dist.tar.gz - # SSH must be correctly configured for this to work. - # Assumes that ``make dist`` was already run - # Example usage: ``make upload USERNAME=rgommers RELEASE=1.10.1`` - ssh $(USERNAME)@docs.scipy.org mkdir $(UPLOAD_DIR) - scp build/dist.tar.gz $(USERNAME)@docs.scipy.org:$(UPLOAD_DIR) - ssh $(USERNAME)@docs.scipy.org tar xvC $(UPLOAD_DIR) \ - -zf $(UPLOAD_DIR)/dist.tar.gz - ssh $(USERNAME)@docs.scipy.org mv $(UPLOAD_DIR)/numpy-ref.pdf \ - $(UPLOAD_DIR)/numpy-ref-$(RELEASE).pdf - ssh $(USERNAME)@docs.scipy.org mv $(UPLOAD_DIR)/numpy-user.pdf \ - $(UPLOAD_DIR)/numpy-user-$(RELEASE).pdf - ssh $(USERNAME)@docs.scipy.org mv $(UPLOAD_DIR)/numpy-html.zip \ - $(UPLOAD_DIR)/numpy-html-$(RELEASE).zip - ssh $(USERNAME)@docs.scipy.org rm $(UPLOAD_DIR)/dist.tar.gz - ssh $(USERNAME)@docs.scipy.org ln -snf numpy-$(RELEASE) /srv/docs_scipy_org/doc/numpy - - merge-doc: build/dist.tar.gz ifeq "$(TAG)" "" echo tag "$(TAG)" not of the form 1.18; @@ -155,14 +128,14 @@ endif tar -C build/merge/$(TAG) -xf build/dist.tar.gz git -C build/merge add $(TAG) @# For now, the user must do this. If it is onerous, automate it and change - @# the instructions in doc/HOWTO_RELEASE.rst.txt + @# the instructions in doc/HOWTO_RELEASE.rst @echo " " @echo New documentation archive added to ./build/merge. - @echo Now add/modify the appropiate section after + @echo Now add/modify the appropriate section after @echo " " @echo in build/merge/index.html, @echo then \"git commit\", \"git push\" - + #------------------------------------------------------------------------------ # Basic Sphinx generation rules for different formats @@ -176,27 +149,17 @@ build/generate-stamp: $(wildcard source/reference/*.rst) html: version-check html-build html-build: generate mkdir -p build/html build/doctrees + $(PYTHON) preprocess.py +ifeq (, $(shell which $(DOXYGEN))) + @echo "Unable to find 'Doxygen:$(DOXYGEN)', skip generating C/C++ API from comment blocks." +else + $(DOXYGEN) build/doxygen/Doxyfile +endif $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html $(FILES) $(PYTHON) postprocess.py html build/html/*.html @echo @echo "Build finished. The HTML pages are in build/html." -html-scipyorg: - mkdir -p build/html build/doctrees - $(SPHINXBUILD) -t scipyorg -b html $(ALLSPHINXOPTS) build/html-scipyorg $(FILES) - @echo - @echo "Build finished. The HTML pages are in build/html." - -pickle: generate version-check - mkdir -p build/pickle build/doctrees - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle $(FILES) - @echo - @echo "Build finished; now you can process the pickle files or run" - @echo " sphinx-web build/pickle" - @echo "to start the sphinx-web server." - -web: pickle - htmlhelp: generate version-check mkdir -p build/htmlhelp build/doctrees $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp $(FILES) @@ -217,7 +180,7 @@ latex-build: generate mkdir -p build/latex build/doctrees $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex $(FILES) $(PYTHON) postprocess.py tex build/latex/*.tex - perl -pi -e 's/\t(latex.*|pdflatex) (.*)/\t-$$1 -interaction batchmode $$2/' build/latex/Makefile + perl -pi -e 's/LATEXOPTS =/LATEXOPTS ?= --halt-on-error/' build/latex/Makefile @echo @echo "Build finished; the LaTeX files are in build/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ @@ -240,7 +203,6 @@ linkcheck: generate version-check @echo @echo "Link check complete; look for any errors in the above output " \ "or in build/linkcheck/output.txt." - texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) build/texinfo @echo @@ -253,3 +215,7 @@ info: @echo "Running Texinfo files through makeinfo..." make -C build/texinfo info @echo "makeinfo finished; the Info files are in build/texinfo." + + +show: + @python -c "import webbrowser; webbrowser.open_new_tab('file://$(PWD)/build/html/index.html')" diff --git a/doc/Py3K.rst.txt b/doc/Py3K.rst similarity index 98% rename from doc/Py3K.rst.txt rename to doc/Py3K.rst index b23536ca535c..cde0394ddab6 100644 --- a/doc/Py3K.rst.txt +++ b/doc/Py3K.rst @@ -355,9 +355,7 @@ The Py2/Py3 compatible structure definition looks like:: (binaryfunc)0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ - #if PY_VERSION_HEX >= 0x02050000 (unaryfunc)NULL, /*nb_index*/ - #endif }; @@ -394,14 +392,6 @@ There are a couple of places that need further attention: In some cases, this returns a buffer object on Python 2. On Python 3, there is no stand-alone buffer object, so we return a byte array instead. -- multiarray.int_asbuffer - - Converts an integer to a void* pointer -- in Python. - - Should we just remove this for Py3? It doesn't seem like it is used - anywhere, and it doesn't sound very useful. - - The Py2/Py3 compatible PyBufferMethods definition looks like:: NPY_NO_EXPORT PyBufferProcs array_as_buffer = { @@ -428,10 +418,6 @@ The Py2/Py3 compatible PyBufferMethods definition looks like:: Produce PEP 3118 format strings for array scalar objects. -.. todo:: - - Figure out what to do with int_asbuffer - .. todo:: There's stuff to clean up in numarray/_capi.c diff --git a/doc/RELEASE_WALKTHROUGH.rst b/doc/RELEASE_WALKTHROUGH.rst new file mode 100644 index 000000000000..f064b3405b34 --- /dev/null +++ b/doc/RELEASE_WALKTHROUGH.rst @@ -0,0 +1,364 @@ +This is a walkthrough of the NumPy 1.21.0 release on Linux, modified for +building with GitHub Actions and cibuildwheels and uploading to the +`anaconda.org staging repository for NumPy `_. +The commands can be copied into the command line, but be sure to replace 1.21.0 +by the correct version. This should be read together with the +:ref:`general release guide `. + +Facility preparation +==================== + +Before beginning to make a release, use the ``*_requirements.txt`` files to +ensure that you have the needed software. Most software can be installed with +pip, but some will require apt-get, dnf, or whatever your system uses for +software. You will also need a GitHub personal access token (PAT) to push the +documentation. There are a few ways to streamline things: + +- Git can be set up to use a keyring to store your GitHub personal access token. + Search online for the details. +- You can use the ``keyring`` app to store the PyPI password for twine. See the + online twine documentation for details. + + +Release preparation +=================== + +Add/drop Python versions +------------------------ + +When adding or dropping Python versions, three files need to be edited: + +- .github/workflows/wheels.yml # for github cibuildwheel +- .travis.yml # for cibuildwheel aarch64 builds +- setup.py # for classifier and minimum version check. + +Make these changes in an ordinary PR against main and backport if necessary. +Using the `BLD:` prefix (build label) for the commit summary will cause the +wheel builds to be run so that the changes will be tested, We currently release +wheels for new Python versions after the first Python rc once manylinux and +cibuildwheel support it. For Python 3.11 we were able to release within a week +of the rc1 announcement. + +Backport Pull Requests +---------------------- + +Changes that have been marked for this release must be backported to the +maintenance/1.21.x branch. + +Update release documentation +---------------------------- + +Four documents usually need to be updated or created before making a release: + +- The changelog +- The release-notes +- The ``.mailmap`` file +- The ``doc/source/release.rst`` file + +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 +~~~~~~~~~~~~~~~~~~~~~~ + +The changelog is generated using the changelog tool:: + + $ python tools/changelog.py $GITHUB v1.20.0..maintenance/1.21.x > doc/changelog/1.21.0-changelog.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. + +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 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. + +1. 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.21.x + $ git pull upstream maintenance/1.21.x + $ git submodule update + $ git clean -xdfq + +Sanity check:: + + $ python3 -m spin test -m full + +Tag the release and push the tag. This requires write permission for the numpy +repository:: + + $ git tag -a -s v1.21.0 -m"NumPy 1.21.0 release" + $ git push upstream v1.21.0 + +If you need to delete the tag due to error:: + + $ git tag -d v1.21.0 + $ git push --delete upstream v1.21.0 + +2. Build wheels +--------------- + +Build wheels via cibuildwheel (preferred) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tagging the build at the beginning of this process will trigger a wheel build +via cibuildwheel and upload wheels and an sdist to the staging repo. The CI run +on github actions (for all x86-based and macOS arm64 wheels) takes about 1 1/4 +hours. The CI run on travis (for aarch64) takes less time. You can check for +uploaded files at the `staging repository`_, but note that it is not closely +synched with what you see of the running jobs. + +If you wish to manually trigger a wheel build, you can do so: + +- On github actions -> `Wheel builder`_ there is a "Run workflow" button, click + on it and choose the tag to build +- On travis_ there is a "More Options" button, click on it and choose a branch + to build. There does not appear to be an option to build a tag. + +If a wheel build fails for unrelated reasons, you can rerun it individually: + +- On github actions select `Wheel builder`_ click on the commit that contains + the build you want to rerun. On the left there is a list of wheel builds, + select the one you want to rerun and on the resulting page hit the + counterclockwise arrows button. +- On travis_ select the failing build, which will take you to the travis job for + that build. Hit the restart job button. + +Note that if you do need to rerun jobs, you will need to delete the uploaded +file, if any, in the anaconda `staging repository`_, The old files will not be +overwritten. + +.. _`staging repository`: https://anaconda.org/multibuild-wheels-staging/numpy/files +.. _`Wheel builder`: https://github.com/numpy/numpy/actions/workflows/wheels.yml +.. _travis : https://app.travis-ci.com/github/numpy/numpy + + +3. Download wheels +------------------ + +When the wheels have all been successfully built and staged, download them from the +Anaconda staging directory using the ``tools/download-wheels.py`` script:: + + $ cd ../numpy + $ mkdir -p release/installers + $ python3 tools/download-wheels.py 1.21.0 + + +4. Generate the README files +---------------------------- + +This needs to be done after all installers are downloaded, but before the pavement +file is updated for continued development:: + + $ paver write_release + + +5. Reset the maintenance branch into a development state (skip for prereleases) +------------------------------------------------------------------------------- + +Create release notes for next release and edit them to set the version. These +notes will be a skeleton and have little content:: + + $ 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 + +Add new release notes to the documentation release list and update the +``RELEASE_NOTES`` variable in ``pavement.py``:: + + $ gvim doc/source/release.rst pavement.py + +Commit the result:: + + $ git commit -a -m"REL: prepare 1.21.x for further development" + $ git push upstream HEAD + + +6. Upload to PyPI +----------------- + +Upload to PyPI using ``twine``. A recent version of ``twine`` of is needed +after recent PyPI changes, version ``3.4.1`` was used here:: + + $ cd ../numpy + $ twine upload release/installers/*.whl + $ twine upload release/installers/numpy-1.21.0.tar.gz # 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, 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. + + +7. Upload files to github +------------------------- + +Go to ``_, 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. 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/README.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. + + +8. Upload documents to numpy.org (skip for prereleases) +------------------------------------------------------- + +.. note:: You will need a GitHub personal access token to push the update. + +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:: + + $ git clean -xdfq + $ git co v1.21.0 + $ pushd doc + $ make docenv && source docenv/bin/activate + $ make merge-doc + $ pushd build/merge + +If the release series is a new one, you will need to add a new section to the +``doc/build/merge/index.html`` front page just after the "insert here" comment:: + + $ gvim index.html +/'insert here' + +Further, update the version-switcher json file to add the new release and +update the version marked `(stable)`:: + + $ gvim _static/versions.json + +Otherwise, only the ``zip`` link should be updated with the new tag name. Since +we are no longer generating ``pdf`` files, remove the line for the ``pdf`` +files if present:: + + $ gvim index.html +/'tag v1.21' + +You can "test run" the new documentation in a browser to make sure the links +work:: + + $ firefox index.html # or google-chrome, etc. + +Update the stable link and update:: + + $ ln -sfn 1.21 stable + $ ls -l # check the link + +Once everything seems satisfactory, update, commit and upload the changes:: + + $ python3 update.py + $ git commit -a -m"Add documentation for v1.21.0" + $ git push + $ deactivate + $ popd + $ popd + + +9. Announce the release on numpy.org (skip for prereleases) +----------------------------------------------------------- + +This assumes that you have forked ``_:: + + $ cd ../numpy.org + $ git checkout main + $ git pull upstream main + $ git checkout -b announce-numpy-1.21.0 + $ gvim content/en/news.md + +- For all releases, go to the bottom of the page and add a one line link. Look + to the previous links for example. +- For the ``*.0`` release in a cycle, add a new section at the top with a short + description of the new features and point the news link to it. + +commit and push:: + + $ git commit -a -m"announce the NumPy 1.21.0 release" + $ git push origin HEAD + +Go to your Github fork and make a pull request. + +10. Announce to mailing lists +----------------------------- + +The release should be announced on the numpy-discussion, scipy-devel, +scipy-user, and python-announce-list mailing lists. Look at previous +announcements for the basic template. The contributor and PR lists are the same +as generated for the release notes above. If you crosspost, make sure that +python-announce-list is BCC so that replies will not be sent to that list. + + +11. Post-release tasks (skip for prereleases) +--------------------------------------------- + +Checkout main and forward port the documentation changes:: + + $ 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 status # check status before commit + $ git commit -a -m"MAINT: Update main after 1.21.0 release." + $ git push origin HEAD + +Go to GitHub and make a PR. + +12. Update oldest-supported-numpy +--------------------------------- + +If this release is the first one to support a new Python version, or the first +to provide wheels for a new platform or PyPy version, the version pinnings +in https://github.com/scipy/oldest-supported-numpy should be updated. +Either submit a PR with changes to ``setup.cfg`` there, or open an issue with +info on needed changes. + diff --git a/doc/RELEASE_WALKTHROUGH.rst.txt b/doc/RELEASE_WALKTHROUGH.rst.txt deleted file mode 100644 index 0a761e350b43..000000000000 --- a/doc/RELEASE_WALKTHROUGH.rst.txt +++ /dev/null @@ -1,300 +0,0 @@ -This file contains a walkthrough of the NumPy 1.14.5 release on Linux. -The commands can be copied into the command line, but be sure to -replace 1.14.5 by the correct version. - - -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. - - -Backport Pull Requests ----------------------- - -Changes that have been marked for this release must be backported to the -maintenance/1.14.x branch. - - -Update Release documentation ----------------------------- - -The file ``doc/changelog/1.14.5-changelog.rst`` should be updated to reflect -the final list of changes and contributors. This text can be generated by:: - - $ python tools/changelog.py $GITHUB v1.14.4..maintenance/1.14.x > doc/changelog/1.14.5-changelog.rst - -where ``GITHUB`` contains your github access token. This text may also be -appended to ``doc/release/1.14.5-notes.rst`` for release updates, though not -for new releases like ``1.14.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 master. - - -Finish the Release Note ------------------------ - -.. note: - - This has changed now that we use ``towncrier``. See the instructions for - creating the release note in ``doc/release/upcoming_changes/README.rst``. - -Fill out the release note ``doc/release/1.14.5-notes.rst`` calling out -significant changes. - - -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.14.x - $ git pull upstream maintenance/1.14.x - $ git submodule update - $ git clean -xdfq - -Edit pavement.py and setup.py as detailed in HOWTO_RELEASE:: - - $ gvim pavement.py setup.py - $ git commit -a -m"REL: NumPy 1.14.5 release." - -Sanity check:: - - $ python runtests.py -m "full" # NumPy < 1.17 only - $ python3 runtests.py -m "full" - -Push this release directly onto the end of the maintenance branch. This -requires write permission to the numpy repository:: - - $ git push upstream maintenance/1.14.x - -As an example, see the 1.14.3 REL commit: ``_. - - -Build source releases ---------------------- - -Paver is used to build the source releases. It will create the ``release`` and -``release/installers`` directories and put the ``*.zip`` and ``*.tar.gz`` -source releases in the latter. :: - - $ python3 -m cython --version # check for correct cython version - $ paver sdist # sdist will do a git clean -xdf, so we omit that - - -Build wheels ------------- - -Trigger the wheels build by pointing the numpy-wheels repository at this -commit. This can take a while. The numpy-wheels repository is cloned from -``_. Start with a pull as the repo -may have been accessed and changed by someone else and a push will fail:: - - $ cd ../numpy-wheels - $ git pull upstream master - $ git branch # only when starting new numpy version - $ git checkout v1.14.x # v1.14.x already existed for the 1.14.4 release - -Edit the ``.travis.yml`` and ``.appveyor.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``, see the _example from `v1.14.3`:: - - $ gvim .travis.yml .appveyor.yml - $ git commit -a - $ git push upstream HEAD - -Now wait. If you get nervous at the amount of time taken -- the builds can take -several hours-- you can check the build progress by following the links -provided at ``_ to check the travis -and appveyor build status. Check if all the needed wheels have been built and -uploaded before proceeding. There should currently be 22 of them at -``_, 4 for Mac, 8 for Windows, and 10 for Linux. -Note that sometimes builds, like tests, fail for unrelated reasons and you will -need to restart them. - -.. example_: https://github.com/MacPython/numpy-wheels/commit/fed9c04629c155e7804282eb803d81097244598d - - -Download wheels ---------------- - -When the wheels have all been successfully built, download them using the ``wheel-uploader`` -in the ``terryfy`` repository. The terryfy repository may be cloned from -``_ if you don't already have it. The -wheels can also be uploaded using the ``wheel-uploader``, but we prefer to -download all the wheels to the ``../numpy/release/installers`` directory and -upload later using ``twine``:: - - $ cd ../terryfy - $ git pull upstream master - $ CDN_URL=https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com - $ NPY_WHLS=../numpy/release/installers - $ ./wheel-uploader -u $CDN_URL -n -v -w $NPY_WHLS -t win numpy 1.14.5 - $ ./wheel-uploader -u $CDN_URL -n -v -w $NPY_WHLS -t manylinux1 numpy 1.14.5 - $ ./wheel-uploader -u $CDN_URL -n -v -w $NPY_WHLS -t macosx numpy 1.14.5 - -If you do this often, consider making CDN_URL and NPY_WHLS part of your default -environment. - -Generate the README files -------------------------- - -This needs to be done after all installers are downloaded, but before the pavement -file is updated for continued development:: - - $ cd ../numpy - $ paver write_release - - -Tag the release ---------------- - -Once the wheels have been built and downloaded without errors, go back to your -numpy repository in the maintenance branch and tag the ``REL`` commit, signing -it with your gpg key:: - - $ git tag -s v1.14.5 - -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.14.5 - -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:: - - $ cp doc/release/template.rst doc/release/1.14.6-notes.rst - $ gvim doc/release/1.14.6-notes.rst - $ git add doc/release/1.14.6-notes.rst - -Add new release notes to the documentation release list:: - - $ gvim doc/source/release.rst - -Commit the result:: - - $ git commit -a -m"REL: prepare 1.14.x for further development" - $ git push upstream maintenance/1.14.x - - -Upload to PyPI --------------- - -Upload to PyPI using ``twine``. A recent version of ``twine`` of is needed -after recent PyPI changes, version ``1.11.0`` was used here. - -.. code-block:: sh - - $ cd ../numpy - $ twine upload release/installers/*.whl - $ twine upload release/installers/numpy-1.14.5.zip # Upload last. - -If one of the commands breaks in the middle, which is not uncommon, 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 if pip users access the files while this is in -process. Note that PyPI only allows a single source distribution, here we have -chosen the zip archive. - - -Upload files to github ----------------------- - -Go to ``_, there should be a ``v1.14.5 -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. -- Upload ``release/installers/numpy-1.14.5.tar.gz`` as a binary file. -- Upload ``release/installers/numpy-1.14.5.zip`` as a binary file. -- Upload ``release/README.rst`` as a binary file. -- Upload ``doc/changelog/1.14.5-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 -``doc/build/merge`` and updates it with the new documentation:: - - $ pushd doc - $ make dist - $ make merge-doc - $ popd - -If the release series is a new one, you will need to add a new section to the -``doc/build/merge/index.html`` front page just after the "insert here" comment:: - - $ gvim doc/build/merge/index.html +/'insert here' - -Otherwise, only the ``zip`` and ``pdf`` links should be updated with the -new tag name:: - - $ gvim doc/build/merge/index.html +/'tag v1.14' - -You can "test run" the new documentation in a browser to make sure the links -work:: - - $ firefox doc/build/merge/index.html - -Once everything seems satisfactory, commit and upload the changes:: - - $ pushd doc/build/merge - $ git commit -am"Add documentation for v1.14.5" - $ git push - $ popd - -Announce the release on scipy.org ---------------------------------- - -This assumes that you have forked ``_:: - - $ cd ../scipy.org - $ git checkout master - $ git pull upstream master - $ git checkout -b numpy-1.14.5 - $ 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 -------------------------- - -The release should be announced on the numpy-discussion, scipy-devel, -scipy-user, and python-announce-list mailing lists. Look at previous -announcements for the basic template. The contributor and PR lists are the same -as generated for the release notes above. If you crosspost, make sure that -python-announce-list is BCC so that replies will not be sent to that list. - - -Post-Release Tasks ------------------- - -Forward port the documentation changes ``doc/release/1.14.5-notes.rst``, -``doc/changelog/1.14.5-changelog.rst`` and add the release note to -``doc/source/release.rst``. diff --git a/doc/TESTS.rst.txt b/doc/TESTS.rst similarity index 54% rename from doc/TESTS.rst.txt rename to doc/TESTS.rst index 14cb28df8cef..c2a697b581f5 100644 --- a/doc/TESTS.rst.txt +++ b/doc/TESTS.rst @@ -12,42 +12,40 @@ the `pytest`_ framework. The older framework is still maintained in order to support downstream projects that use the old numpy framework, but all tests for NumPy should use pytest. -Our goal is that every module and package in SciPy and NumPy +Our goal is that every module and package in NumPy should have a thorough set of unit tests. These tests should exercise the full functionality of a given routine as well as its robustness to erroneous or unexpected input -arguments. Long experience has shown that by far the best time to -write the tests is before you write or change the code - this is -`test-driven development -`__. 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 back in unnoticed. -To run SciPy's full test suite, use the following:: +.. note:: - >>> import scipy - >>> scipy.test() + SciPy uses the testing framework from :mod:`numpy.testing`, + so all of the NumPy examples shown below are also applicable to SciPy -or from the command line:: +Testing NumPy +''''''''''''' + +NumPy can be tested in a number of ways, choose any way you feel comfortable. - $ python runtests.py +Running tests from inside Python +-------------------------------- -SciPy uses the testing framework from :mod:`numpy.testing`, so all -the SciPy examples shown here are also applicable to NumPy. NumPy's full test -suite can be run as follows:: +You can test an installed NumPy by `numpy.test`, for example, +To run NumPy's full test suite, use the following:: >>> import numpy - >>> numpy.test() + >>> numpy.test(label='slow') -The test method may take two or more arguments; the first, ``label`` is a -string specifying what should be tested and the second, ``verbose`` is an -integer giving the level of output verbosity. See the docstring for -numpy.test for details. The default value for ``label`` is 'fast' - which +The test method may take two or more arguments; the first ``label`` is a +string specifying what should be tested and the second ``verbose`` is an +integer giving the level of output verbosity. See the docstring +`numpy.test` +for details. The default value for ``label`` is 'fast' - which will run the standard tests. The string 'full' will run the full battery of tests, including those identified as being slow to run. If ``verbose`` is 1 or less, the tests will just show information messages about the tests @@ -55,144 +53,165 @@ that are run; but if it is greater than 1, then the tests will also provide warnings on missing tests. So if you want to run every test and get messages about which modules don't have tests:: - >>> scipy.test(label='full', verbose=2) # or scipy.test('full', 2) + >>> numpy.test(label='full', verbose=2) # or numpy.test('full', 2) -Finally, if you are only interested in testing a subset of SciPy, for -example, the ``integrate`` module, use the following:: +Finally, if you are only interested in testing a subset of NumPy, for +example, the ``core`` module, use the following:: - >>> scipy.integrate.test() + >>> numpy.core.test() -or from the command line:: +Running tests from the command line +----------------------------------- - $python runtests.py -t scipy/integrate/tests +If you want to build NumPy in order to work on NumPy itself, use the ``spin`` +utility. To run NumPy's full test suite:: -The rest of this page will give you a basic idea of how to add unit -tests to modules in SciPy. It is extremely important for us to have -extensive unit testing since this code is going to be used by -scientists and researchers and is being developed by a large number of -people spread across the world. So, if you are writing a package that -you'd like to become part of SciPy, please write the tests as you -develop the package. Also since much of SciPy is legacy code that was -originally written without unit tests, there are still several modules -that don't have tests yet. Please feel free to choose one of these -modules and develop tests for it as you read through -this introduction. + $ spin test -m full + +Testing a subset of NumPy:: + + $ spin test -t numpy/core/tests + +For detailed info on testing, see :ref:`testing-builds` + +Other methods of running tests +------------------------------ + +Run tests using your favourite IDE such as `vscode`_ or `pycharm`_ Writing your own tests '''''''''''''''''''''' -Every Python module, extension module, or subpackage in the SciPy +If you are writing a package that you'd like to become part of NumPy, +please write the tests as you develop the package. +Every Python module, extension module, or subpackage in the NumPy package directory should have a corresponding ``test_.py`` file. -Pytest examines these files for test methods (named test*) and test -classes (named Test*). +Pytest examines these files for test methods (named ``test*``) and test +classes (named ``Test*``). -Suppose you have a SciPy module ``scipy/xxx/yyy.py`` containing a +Suppose you have a NumPy module ``numpy/xxx/yyy.py`` containing a function ``zzz()``. To test this function you would create a test module called ``test_yyy.py``. If you only need to test one aspect of ``zzz``, you can simply add a test function:: def test_zzz(): - assert_(zzz() == 'Hello from zzz') + assert zzz() == 'Hello from zzz' More often, we need to group a number of tests together, so we create a test class:: - from numpy.testing import assert_, assert_raises + import pytest # import xxx symbols - from scipy.xxx.yyy import zzz + from numpy.xxx.yyy import zzz + import pytest class TestZzz: def test_simple(self): - assert_(zzz() == 'Hello from zzz') + assert zzz() == 'Hello from zzz' def test_invalid_parameter(self): - assert_raises(...) + with pytest.raises(ValueError, match='.*some matching regex.*'): + ... -Within these test methods, ``assert_()`` and related functions are used to test +Within these test methods, ``assert`` and related functions are used to test whether a certain assumption is valid. If the assertion fails, the test fails. -Note that the Python builtin ``assert`` should not be used, because it is -stripped during compilation with ``-O``. +``pytest`` internally rewrites the ``assert`` statement to give informative +output when it fails, so should be preferred over the legacy variant +``numpy.testing.assert_``. Whereas plain ``assert`` statements are ignored +when running Python in optimized mode with ``-O``, this is not an issue when +running tests with pytest. + +Similarly, the pytest functions :func:`pytest.raises` and :func:`pytest.warns` +should be preferred over their legacy counterparts +:func:`numpy.testing.assert_raises` and :func:`numpy.testing.assert_warns`, +since the pytest variants are more broadly used and allow more explicit +targeting of warnings and errors when used with the ``match`` regex. + Note that ``test_`` functions or methods should not have a docstring, because that makes it hard to identify the test from the output of running the test suite with ``verbose=2`` (or similar verbosity setting). Use plain comments (``#``) if necessary. -Labeling tests --------------- +Also since much of NumPy is legacy code that was +originally written without unit tests, there are still several modules +that don't have tests yet. Please feel free to choose one of these +modules and develop tests for it. + +Using C code in tests +--------------------- + +NumPy exposes a rich :ref:`C-API` . 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 -As an alternative to ``pytest.mark.